小古银的官方网站(完整教程):http://www.xiaoguyin.com/
C++入门教程视频:https://www.bilibili.com/video/av20868986/
目录
编码
之前提到的ASCII就是一种编码方式。我们知道,计算机只会处理和保存数字,而实际上,计算机上看到的文字,就是数字。
计算机会根据一个个的数字,然后去查一下字典,找出对应的文字的图片,然后交给显卡显示出来,这样我们就能看到文字了。
这个字典叫做字符集。
ASCII就是一个字符集,用数字0~127来代表字母数字符号等字符。
字符集有ASCII、本地字符集(如GBK)和Unicode。
Unicode包括UTF-8、UTF-16、UCS-2、UTF-32、USC-4,而UTF-16与UCS-2可以理解为等价,UTF-32与USC-4等价。并且UTF-16和UTF-32又分别有两种:BE和LE。这些都是数字和文字对应的字典。
有时候我们会看到乱码,就是因为你用错字符集或者你把不是文字的数据用文字字典找文字;归根究底,就是 你!用!错!字!典!了!
C++支持UTF-8、UTF-16、UTF-32和本地字符集。
Windows默认的字符集是UTF-16。而Linux/OS X默认的字符集是UTF-8。所以写跨平台代码就要注意了。就算是同样是Windows,如果你用错字符集,你的程序在英文系统或者中文系统就会出现乱码。
以下是每个字符集和C++数据类型对应关系和如何选择合适的字符集:
字符集 | 字符数据类型 | 字符串数据类型 | 使用方式 | 优点 | 缺点 | 常见使用场景 |
UTF-8 | char | std::string | u8”字符串” | 可跨平台,以每个字符的最小占用来分配大小,所以占用小 | 以每个字符的最小占用来分配大小,ASCII字符用1个字节保存,而中文字符使用3个或4个字节保存,每个字符大小不一样,所以不能直接操作字符串;标准不支持终端直接输出 | 网络传输 |
UTF-16 | char16_t | std::u16string | u”字符串” | 可跨平台,每个字符都用2个字节来保存,占用比UTF-32小,比UTF-8更易运算处理 | 2个字节保存的文字有限,对于emoji表情和部分生僻文字要用多个 char16_t 保存,此时直接处理字符串有可能出错;标准不支持终端直接输出 | 字符串保证没有生僻字时使用 |
UTF-32 | char32_t | std::u32string | U”字符串” | 可跨平台,保存世界上所有字符,处理字符串容易且不会出错 | 每个字符都用4个字节来保存,占用非常大;标准不支持终端直接输出 | 有生僻字或者emoji表情时使用 |
剩下两种(""
和L""
)方式,由于历史原因,在不同的操作系统会有不同的意义,所以会有点复杂:
字符数据类型 | 字符串数据类型 | 使用方式 | 字符集 | 使用场景 |
char | std::string | “字符串” | 本地字符集(Windows) | 字符串只用于显示而不需要进行操作 |
UTF-8(Linux/OS X) | ||||
wchar_t | std::wstring | L”字符串” | UTF-16(Windows) | 程序可跨不同语言的Windows平台,使用Windows API开发Windows桌面应用时推荐使用,跨不同操作系统不推荐使用,需要设置本地字符集 |