C++字符串

C++字符串 ​

多字节和宽字符

C++中只有两个字符类型 char 和 wchar*t,其它所有类型都是这两个类型的别名。如typedef char CHAR;typedef \_Null_terminated* CHAR *NPSTR, *LPSTR, \*PSTR;等。
有人说 wchar_t 表示 Unicode 字符,char 表示 ANSI 字符。这个说法我觉得对,也不对。以我目前对字符的认识来看,char 和 wchar_t 只标识字符在内存中的占位宽度,与编码格式无关。其中,一个 char 占 1 个字节,8bit。一个中文字符占 2 个字节,即 2 个 char,一个英文字符占 1 个字节,即 1 个 char。一个 wchar_t 占 2 个字节,16bit。不管中英文字符都是 1 个 wchar_t,2 个字节。
没有理清这个问题之前,一旦涉及到中文的处理,就经常出乱码,具体问题出在哪里也没有弄清,只能是尝试转换编码格式,期间还掺杂了多字节和宽字符的转换,虽然最终得到了想要的结果,但是这期间应该掺杂了很多无用的转换。从现在开始我才真正理解 python 为什么在文件开始位置要写# -*-coding: utf-8 -*-,能避免好多麻烦。当然了,python 不用编译,本来就省去了好多步骤.
后面开发过程中尽量采用 char 数组来处理字符串,编码统一采用 utf-8,涉及需要转码的情况,只限定在最小作用域内。例如在 creo 二次开发中涉及到中文输出貌似只能用宽字符,这个后面还有待验证,可能是之前的认知有偏差。
声明:以上仅为个人在实际开发过程中通过查阅资料以及实际测试得出的结论,可能不准确或存在错误,欢迎指正。
补充:
在调试过程中查看 char*和 wchar_t*的内存时发现,char*变量中文编码为 GBK,wchar_t*变量中文编码为 Unicode,所以前面说的“ wchar_t 表示 Unicode 字符,char 表示 ANSI 字符”也没有问题。MultiByteToWideChar 和 WideCharToMultiByte 这两个函数只是改变了编码格式,即 char 和 wchar_t 的转换,但是并不能更改字符集。由于 Unicode 在制定过程中并没有参考 GBK,这就导致两种编码并没有一种算法可以转换,理论上转换编码只能通过查表。不知道还有没有其它方式来实现字符集的转换,目前还没有找到。关于字符集和编码格式,下面这篇文章讲的算是比较清楚的了。
https://www.cnblogs.com/echobfy/p/3854307.html
对于简体中文的编码应该只有 GBK 和 Unicode 两种,而 ANSI 就是对 ASCII 的中文扩展,也就是 GBK。GB2312 是 GBK 的子集。Unicode 和 GBK 的交集就是 ASCII。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值