为什么一个中文字符要3个char (三个字节)才能存放 而1个2字节的宽字符wchar_t就能存放一个中文字符? 简要分析中文字符Unicode存储方式

首先 一个char可以被一个中文字符给初始化 但无法通过cout直接输出这个字 char chr1 = '中'; (Tips: 此时鼠标指在'中'上 环境显示的(int)(-10544) 为'中'的机内码 与Unicode编码无关)

如果用char数组 则需要三个字节来保存一个字符 char chs6[3] = "中";
我认为 问题出在这里
很多地方(帖子和GPT之类的)说大多汉字的UTF8编码是三个字节
可以看到 环境提示了"中"是const char [3]类型 2个char是存放不下的

对于"文" 也是一样

然而"中文"则提示是const char [5]

所以我大胆推测 char数组保存中文字符 采用的是字符串类型 一定是带有'\0'结束符
因此常见(有些不常见的字下文解释)的中文字符实际上就是两个字节
也就解释了为什么一个wchar_t(2Bytes) 可以用直接存储单个中文字符并且通过wcout输出
(之所以叫宽字符是因为所有的字都要用两个字节(即一个wchar_t)来表示,不管是英文还是中文)
wchar_t wch1 = L'中'; L表示该字符是一个Unicode字符 会显式该字符的Unicode编码

不加L则显式其机内码

wchar_t数组来保存则是 前两个字节(前一个wchar_t)存放汉字'中',最后两个字节(后一个wchar_t)存放字符串结束符\0 L"中文" 为const wchar_t[3]就很合理了

问题又来了 刚才说常见中文字符实际是两个字节 那有些不常见的 比如 𠀒 (我也不知道这是啥字儿)

可以看到它比'中'的Unicode码多了一位 (AI:这个字符的Unicode编码为U+20012,属于增补汉字B区) 只靠两个wchar_t就不能存放了 对于一些增补汉字 需要更大的空间来进行存储

再回到上面wchar_t wch2 = L'𠀒'; 虽然不会直接报错 但是编译的时候产生了一个warning
warning C4066: 宽字符常量的第一个字符之外的字符被忽略 实际上就是存储不下了

最后 还有一个小问题 刚才char单独存储一个'中' 显示的是机内码
但是'𠀒' 显示的是(char)'\022' 不知道是什么意思 cout输出chr2的结果是??

因此 对于char来说 '𠀒'其实只是一个字节? 这里编译器貌似也晕了 在文本编辑器中 char数组的代码中'𠀒'只占一个位置

chs4[2]相当于一个'𠀒'和一个'\0'

没有提示错误 直到编译才会报错

但就算用3个或者更多char 编译能通过 也会warning
warning C4566: 由通用字符名称“\U00020012”表示的字符不能在当前代码页(936)中表示出来

所以简单总结一下就是 "一个汉字的表示需要三个字节的char变量" 这个说法有点误导
常用的中文字符就只占了2个字节 需要3个字节的char是因为字符串结束符的\0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值