C++ 宽窄字符与字符集

长度

c++ 中 char 占1字节,而wchar_t占2字节。

一个ansi字符 占1个字节

一个unicode字符 占2个字节

一个utf-8字符 不定长

一个gb2312字符 不定长

编码

拿“你好”这两个字来说

如果你的电脑使用gb2312编码

string s = "你好";

那么字符串的长度为4个字节

二进制为                 (11000100 11100011 10111010 11000011)

对应的十进制为               -60         -29         -70         -61

如果你的电脑使用utf8编码

string u = "你好";

那么字符串长度为6个字节

二进制为                (11100100 10111101 10100000 11100101 10100101 10111101)

对应的十进制为                -28         -67         -96         -27         -91         -67

打印

如果我们使用gb2312的电脑来打印utf8 编码的字符串 就会出现 乱码 。

现在我们复现一下,我这台电脑使用的是gb2312编码 ! 

int main(int argc, char* argv[]) {	

    char gb2312[5] = { -60,-29,-70,-61,'\0' };
	char utf8[7] = {-28,-67,-96,-27,-91,-67,'\0' };
	cout << gb2312 << endl;
	cout << utf8<<endl;
    return 0;

}

输出

你好
浣犲ソ

显然使用gb2312打印utf8会出现乱码。

转化

你可以把utf8转换成gb2312解决乱码问题,但我认为最好是把这两个种字符全都转成 unicode,因为 unicode 是固定长度的。

unicode 是2个字节 , wchar_t 也是2个字节, 所以我想你应该明白了。

我们可以使用wchar_t来存储unicode字符,这样就统一了,不管是什么字符都可以存成unicode。

下面代码将utf8 转 unicode 使用wchar_t 存储

#include <codecvt>

int main(int argc, char* argv[]) {	

	char utf8[7] = {-28,-67,-96,-27,-91,-67,'\0' };
    wstring unicode = std::wstring_convert<std::codecvt_utf8<wchar_t>>().from_bytes(utf8);	
	wcout <<unicode<<endl;
    return 0;

}

输出 

你好

PS  wstring f = L"你好";  c++直接将这两个字符保存为unicode。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值