提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
学习时遇到的问题,如有不对,欢迎大佬们批评指正!
一、使用char,char*,char[],string存储中文
char 类型是有符号的,其范围是-128到127。当一个超出 char类型表示范围的值被赋值给一个 char 类型变量时,会发生截断。截断的过程实际上是将原始值的高位部分丢弃,只保留低位部分。
查看得vs编译器默认采用unicode字符集(Unicode 只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储),GB2312编码。
(关于上面一句话我的理解是中文字符按照unicode进行翻译对应码值,存储到内存时候按照GB2312方式存储。这一点不是很确定?求指导),GB2312编码时1个中文占两个字节,char只有一个字节,存储失败,会发生截断。
eg:char a= ‘好’;
‘好’ 对应unicode码值为0x597D, 内存存储按照小端序存储:0x7D 59 ,char a占一个字节,读取内存是从&a开始往后读1个字节,所以此时a在内存中的地址为0x 7D,换为2进制:1111101,因为char是有符号类型,最高位1为符号位,表示负数,真值为111101=61(10进制),所以此时截取后的码值为-61。
![a内存地址的值](/i/ll/?i=direct/c93588a4c89c4836aaf3ed37f7b1ef84.png
’这也说明了所有中文如果存储在char,char*,char[],string类型中,后三种类型虽然不会像char截断,但是也是分两个字节进行存储中文,中文分开两个字节存储时候编译器的unicode字符集就无法识别,又因为每个字节十六进制转为2进制的第一位一定是1,所以显示在内存中的每个元素的码值为负数。
二、内存中是乱码,但是可以正常输出
此时cout可以显示str为你好,猜测原因是输出时,因为内存空间是连续的,按照vs字符集unicode翻译还是可以翻译出来的。
三、解决方法:w_char,
为此设计wchat_t字符,即宽字符,每个字符都是按照两个字节来编码。为了和传统的char字符区分,wchar_t字符(串)在申明的时候,需要加上大写字母“L”。既然有wchar_t,标准库自然有其对应的字符串:wstring。
相对应的用标准输入输出流打印宽字节字符(串),需要用std::wcout;
但此时发现wcout是只能输出纯英文字符串,含中文的字符串输出为空。可以在前面加一行代码:
setlocale(LC_ALL, “chs”);
设置程序的本地化信息,将程序的区域设置为简体中文(“chs” 表示简体中文)。此时就可以正常输出中文。(但C++中直接使用setlocale似乎不太规范,后续在研究)