汉字到底占几个字节丨C「建议收藏」

汉字到底占几个字节丨C「建议收藏」首先需要注意汉字所占字节数,与语言没有关系,是与其使用的字符集的编码方式有关验证方法1.把下面代码保存到一个文本文体中#include#includeintmain(){char*a=”我”;printf(“%d”,strlen(a));return0;}复制代码2.在终端中

大家好,又见面了,我是你们的朋友全栈君。

这里写图片描述


首先需要注意

汉字所占字节数,与所使用语言自身没有关系,是与其使用的字符集的编码方案有关


验证方法

1.把下面代码保存到一个文本文体中

#include <stdio.h>
#include <string.h>
int main(){
        char *a = "我";
        printf("%d",strlen(a));
        return 0;
}

2.在终端中用vim打开保存上面代码的文件。

    \>vim char.c       ( >表示终端中输入)

3.在vim中输入如下 :set fileencoding 会显示当前编码格式。(冒号不能省略)


4.把文件编码改为utf-8 在打开的文件中输入 :set fileencoding=utf-8 冒号不能省,保存文件。


5.编译执行

   >gcc char.c
   >./a.out

6.重复3-5步,把第四步utf-8改为gb2312
:set fileencoding=gb2312


7.两次打印一个3,一个2


结论

到底C语言中的汉字占用几个字节,只跟其采用的字符集的编码方案有关

gb2312中占用2个字节,utf-8中占用3个字节


额外介绍字符集与编码方式

一、中文可能碰到的编码

ANSI:最早的时候计算机ASCII码只能表示256个符号(含控制符号),这个字符集表示英文字母足够,其中,我们键盘上可见的符号的编码范围是从32到126(大小写英文字母、数字、英文符号等)。但表示汉字、日语、韩语就不太够用了,汉字常用字有3000多个。

不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码

但是中国人也要用电脑打字,于是,中国人就研究出来了最早的中文字符集GB2312(GBK就是后来的扩展),GB2312的做法是,把ASC码取值范围的128~255这个区间挪用了一下,用两个ASC码表示一个汉字,这样可用的编码范围用十六进制表示就是0x8080到0xFFFF,这大概能表示一万多个符号,足够了。[注:实际没用那么多,GBK的范围是8140-FEFE]

那个时候,计算机技术还不发达,各个国家搞自己的,比如台湾,也另搞了一套,叫BIG5(俗称:大五码),跟大陆的也不太一样,但方法是类似的,都是用0x80到0xFF这个区间。然后日语(有编码JIS)、韩语等等也各搞一套。

这些国家的编码区间都是重叠的,但同一个汉字(比如有一些汉字同时存在于简体、繁体、日语汉字中)有不同的编码,很混乱是不是?但也凑合用了。编码不同导致了很多麻烦,比如一个网页,如果你不知道它是什么编码的,那么你可能很难确定它显示的是什么,一个字符可能是大陆简体/台湾繁体/日本汉字,但又是不同的几个字。所以如果用一些很老的软件,可能会听说有中文版/日文版之类的,对应的版本只能在对应的系统上运行。

后来,这个对操作系统的开发实在是太困难了,因为这意味着不同语言的版本,都要重新编码。于是发明了Unicode。

Unicode这个东西,就是要把地球上所有的语言的符号,都用统一的字符集来表示,一个编码真正做到了唯一。

Unicode里有几种编码方案:

UTF-8:UTF-8则是网页比较流行的一种格式:用一个字节表示英文字符,用3个字节表示汉字,准确的说,UTF-8是用二进制编码的前缀,如果某个UTF-8的编码的第一个字节的最高二进制位是0,则这个编码占1字节,如果是110,则占2字节,如果是1110,则占3字节……

UTF-16BE/LE:UTF-16就是Windows模式的编码模式(Windows里说的Unicode一般都是指这种编码),用2个字节表示任意字符,注意:英文字符也占2个字节(变态不?),这种编码可以表示65536个字符,至于LE和BE,就是一个数值在内存/磁盘上的保存方式,比如一个编码0x8182,在磁盘上应该是0x81 0x82呢?还是0x82 0x81呢?就是高位是最先保存还是最后保存的问题,前者为BE,后者为LE。

UTF-32:UTF-32对每个字符都使用4字节,用得很少,太费空间

二、字符集与编码格式

对于 ASCII、GB 2312、Big5、GBK、GB 18030 之类的遗留方案来说,基本上一个字符集方案只使用一种编码方案。
比如 ASCII 这部标准本身就直接规定了字符和字符编码的方式,所以既是字符集又是编码方案;而 GB 2312 只是一个区位码形式的字符集标准,不过实际上基本都用 EUC-CN 来编码,所以提及「GB 2312」时也说的是一个字符集和编码连锁的方案;GBK 和 GB 18030 等向后兼容于 GB 2312 的方案也类似。

于是,很多人受这些遗留方案的影响而无法理解字符集和编码的关系。

对于 Unicode,字符集和编码是明确区分的。Unicode/UCS 标准首先是个统一的字符集标准。而 Unicode/UCS 标准同时也定义了几种可选的编码方案,在标准文档中称作「encoding form」,主要包括 UTF-8、UTF-16 和 UTF-32。
所以,对 Unicode 方案来说,同样的基于 Unicode 字符集的文本可以用多种编码来存储、传输。
所以,用「Unicode」来称呼一个编码方案不合适,并且误导

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/153153.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • smartctl命令详解_strace命令详解

    smartctl命令详解_strace命令详解smartctl命令详解定义smart(Self-Monitoring,AnalysisandReportingTechnology)是常用的磁盘检查工具smartctl:smartd由kernel-utils包缺省安装。用命令rpm-qlkernel-utils可以列出kernel-utils包中的文件它有一个守护进程(一个帮助程序)smartd,它能监视拥有自我监视,分析和汇报技术(Self-Monitoring,Analysis,andReportingTechnol

    2022年10月8日
    2
  • 服务器查询外网ip的方法

    服务器查询外网ip的方法curlhttpbin.org/ip[root@yx01~]#curlhttpbin.org/ip{“origin”:”120.24.109.9″}[root@yx01~]#

    2022年5月1日
    53
  • android之activity的生命周期详解

    刚在看mars老师的视频,看到activity的生命周期,感觉挺有收获,就总结了一下.为了更清楚的看清楚工作的具体过程,举例如下:,建立两个activity,一个main,一个another,在main里面放置button加监听器跳转向another,在每个复写的activity的状态方法里都加一个log输出,比如onCrea

    2022年3月9日
    38
  • 修改asmx样式

    修改asmx样式今天看到一张图,asmx的WebService。长这样:当时就感觉有意思,这个页面风格和我们平时的不一样,我们平时的WebService长这样:我们如果在WebMetohd上面加注释,即[WebMethod(Description=”注释”)],那么长这样:那么问题就来了,第一张图里面的样式是如何实现的呢?在浏览器上进入调试模式观察,可以发现它的html和我们的有点不…

    2022年4月29日
    34
  • java executeupdate_Java自学-JDBC execute与executeUpdate的区别

    java executeupdate_Java自学-JDBC execute与executeUpdate的区别JDBC中execute与executeUpdate的区别execute与executeUpdate的区别步骤1:相同点execute与executeUpdate的相同点:都可以执行增加,删除,修改packagejdbc;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.SQLExceptio…

    2022年10月20日
    2
  • ie9兼容性视图设置_ie11兼容性视图设置

    ie9兼容性视图设置_ie11兼容性视图设置2019独角兽企业重金招聘Python工程师标准>>>…

    2025年9月6日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号