首先 一个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