当前位置:网站首页>c语言char, wchar_t, char16_t, char32_t和字符集的关系

c语言char, wchar_t, char16_t, char32_t和字符集的关系

2022-07-06 13:08:00 landian004

1,char不是标准里写死的固定8位,但它是固定的c/c++中的1 字节!

但一般就是8位。而且是8位时,还分 有符号和无符号,无符号时是0-255,有符号时是0-127。有符号时对应 的就只能是ASCII字符集了,因为iso-8859-1或windows1252或EBCDIC是256个字符的。我们的电脑上一般就是 有符号的,也就是对应的ASCII字符集。win,mac和linux上可以去验证(怎样验证?)

2,wchar_t是16位或32位(linux里是32位,win里是16位),所以它不可移植。
wchar_t还跟setlocale函数有联系,必须用到setlocale函数,它对应的字符集不知道跟setlocale有怎样的联系,第二,setlocale不知道跟char16_t 和char32_t有关联吗?总的来说,因为不可移植,用不到wchar_t,而直接用固定宽度字符集的char16_t和char32_t。

3,char16_t是确定的16位,也是确定的utf16字符集。而ucs-2才是确定的16位,utf16不是确定的16位,它是变长的(可以是16位和32位)。char16_t是能存储所有的utf16的code units,而不是code points(也即是所有字符),在utf16编码方案里超过16位长的字符用2个code units来表示。也即是utf16里超过16位长的字符是2个char16_t 来表示

4,char32_t是确定的32位,确定的utf32 。只是缺点是它浪费空间!

5,但是实际使用中,不能用char16_t , char32_t,原因是语言和标准库里竟然没有 这2种c11新类型的输出方法!!所以还是只能用wchar_t!!

char* str="中文";   // 不对
wchar_t* str2 = L"中文";  //用这种
char16_t str3 = u"中文";  //没有wprintf等输出函数!所以不能用!

6,用char* str = "中文"; printf("%s", str); 同样能正确打印,但用strlen()函数测长度就错了,不应该用char* 或 const char* 或 char str[] 来表示中文字符串。问题:char* str和printf(而不是wprintf)也能正确表示和打印中文字符串的原因是什么呢?

7,char和wchar_t的表示和打印 都只是控制台程序才用到,当写图形界面程序时相应库里有中文在界面中的输出的函数,比如SDL里?但是控制台程序里表示和打印中文时,虽然不用wchar_t和wprintf和setlocale()函数仍然能正确处理,但正确做法仍然是用wchar_t,setlocale(),wprintf这些来表示。

8,setlocale(LC_ALL, "zh-CN"); // "zh-CN"或“zh-CN.UTF-8"或 "",这3种表示法都行,为了可移植推荐用"zh-CN" 这种写法(实际试验得 "zh-CN.UTF-8"也行,且不区分大小写)。"zh-CN"这里还有更多表示法。但是setlocale的原理仍不清楚??

以上是查阅阶段1的总结。

原网站

版权声明
本文为[landian004]所创,转载请带上原文链接,感谢
https://blog.csdn.net/landian004/article/details/125527438