ANSI到Unicode或向后转换:如何做到这一点?

时间:2012-11-20 06:59:13

标签: c++ unicode ansi

有几个函数可以将ANSI转换为Unicode,反之亦然。以下是这些函数WideCharToMultiByteMultiByteToWideCharA2WW2A

现在我不明白A2WW2A的工作原理。 问题是,当您将某些内容转换为其他内容时,您应该将两个集合设置为A并设置B,以便将集合A中的每个元素映射到一个且仅唯一地设置B中的一个元素。关于此,有几个问题:

  1. ANSI是一个字节,UNICODE至少是2个字节,这意味着UNICODE集中的所有元素都不能唯一地映射到ANSI。

  2. 设置ANSI并且未严格定义Unicode。我的意思是两者都有不同的编码。

  3. 在此,我的问题是:我们如何转换它们并确保我们没有破坏数据?

2 个答案:

答案 0 :(得分:4)

正如其他人所提到的,没有像'ANSI'这样的字符集。不幸的是,Windows API引用了CP_ACP,即“ANSI代码页”,它引用了几个字符集中的一个,具体取决于您的计算机上选择了哪种非unicode语言环境。

那就是说,关于你原来的问题,不,你不能总是在CP_ACP和unicode编码之间往返。例如,在英语区域窗口系统上,CP_ACP中的あ没有等效词。

如果发生这种情况,WideCharToMultiByte将替换与lpDefaultChar无效的字符(如果已设置),并将*lpUsedDefaultChar设置为true。您可以将指针传递给lpUsedDefaultChar中的布尔变量,并在调用后检查它是否包含不可翻译的字符。但是,只要输入在本地代码页中有效,另一个方向MultiByteToWideChar就不会失败。要尝试检测无效文本,请传入MB_ERR_INVALID_CHARS标记并检查错误 - 这只是因为文本在其他代码页中,并不意味着您将从中获得错误(这很难)判断文本是否真的无效,或者仅仅是胡言乱语。)

答案 1 :(得分:1)

进行往返转换,然后将结果与原始结果进行比较。

如果您愿意,可以调用转换函数,以便为未定义的结果抛出错误。