在代码中调用“编码转换方法”一节里提到的函数,将 gb2312 编码的字符串转换为 UTF8 编码,分析其编码转换的行为:
在英文 Linux 环境下,执行下列命令:
export LC_ALL=zh_CN.gb2312然后编译并执行以下程序(其中汉字都是在 gb2312 环境中写入源文件)
L1: wstring ws = L"一"; L2: string s_gb2312 = "一"; L3: wchar_t * wcs = MBs2WChar(s_gb2312.c_str()); L4: char* cs = WChar2MBs(wcs);查看输出:
L1 - 1 wide char: 0x04bb L2 - 2 bytes:0xd2,0xbb,即 gb2312 编码 0xD2BB L3 - 返回的 wchar_t 数组内容为 0x4E00,也就是 Unicode 编码 L4 - 将 Unicode 再度转换为 UTF8 编码,输出的字符长度为 3,即 0xE4,oxB8,0x80在 L1 行,执行结果显示编码为一个 0x04bb,其实这是一个转换错误,如果使用其他汉字,如“哈”,编译都将无法通过。也就是说 Linux 环境下,直接声明中文宽字符串是不正确的,编译器不能够正确转换。
而在中文 windows 下使用相同测试代码,则会在 L1 处出现区别,ws 中的 wchar_t 元素十六进制值是 0x4e00,这是汉字“一”的 Unicode 编码。