简介
经常在处理字符串的时候出现乱码,主要是字符串编码未正确处理。在这种情况下我们首先要分析清楚输入字符串的编码,经过处理的编码和最终输出的编码是否是正确处理的。
本章以内存分析方法跟踪字符集变化的过程,以了解字符存储与转换的编码问题。
宽字符和多字节
-
宽字符和多字节是存储一个字符的字节不一样,和字符编码无关。多字节就是用一个字节表示一个字符,宽字符就是用≥2个字节表示一个字符。
#include <string> #include <iostream> void printMem(char* pMem, size_t size) { for (std::size_t index = 0; index < size; index++) { if (index != 0) { std::cout << " "; } std::cout << std::hex << (int)pMem[index]; } std::cout << std::endl; } int main() { std::string str1("AB"); printMem(str1.data(), str1.length() + 1); std::wstring str2(L"AB"); printMem((char*)str2.data(), (str2.length() + 1) * 2); return 0; } // 结果输出: // 41 42 0 // 41 0 42 0 0 0
查看系统编码
-
查看字符集编码
windows在cmd命令下输入chcp命令可查看。如下:
代码页是字符集编码的别名,也有人称"内码表。下表列出了所有支持的代码页及其国家(地区)或者语言:
代码页 国家(地区)或语言 437 美国 708 阿拉伯文(ASMO 708) 720 阿拉伯文(DOS) 850 多语言(拉丁文 I) 852 中欧(DOS) - 斯拉夫语(拉丁文 II) 855 西里尔文(俄语) 857 土耳其语 860 葡萄牙语 861 冰岛语 862 希伯来文(DOS) 863 加拿大 - 法语 865 日耳曼语 866 俄语 - 西里尔文(DOS) 869 现代希腊语 874 泰文(Windows) 932 日文(Shift-JIS) 936 中国 - 简体中文(GB2312)现在是GBK了,GBK是在国家标准GB2312基础上扩容后兼容GB2312的标准。 949 韩文 950 繁体中文(Big5)