前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >汉字到底占几个字节丨C「建议收藏」

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

作者头像
全栈程序员站长
发布2022-09-13 15:10:05
1K0
发布2022-09-13 15:10:05
举报
文章被收录于专栏:全栈程序员必看

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


首先需要注意

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


验证方法

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

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>
int main(){
        char *a = "我";
        printf("%d",strlen(a));
        return 0;
}

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

代码语言:javascript
复制
    \>vim char.c       ( >表示终端中输入)

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


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


5.编译执行

代码语言:javascript
复制
   >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.cn/153153.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 首先需要注意
  • 验证方法
  • 结论
  • 额外介绍字符集与编码方式
    • 一、中文可能碰到的编码
      • 二、字符集与编码格式
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档