1

有几个函数可以将 ANSI 转换为 Unicode,反之亦然。这是那些函数WideCharToMultiByte, MultiByteToWideChar, A2W, W2A

现在我不明白如何A2W工作W2A问题是,当您将某物转换为另一物时,您应该设置两个集合AB以便集合中的每个元素都唯一地A映射到一个且只有一个元素B对此有几个问题:

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

  2. SetANSI和 setUnicode没有严格定义。我的意思是两者都有不同的编码。

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

4

2 回答 2

5

正如其他人所提到的,没有像“ANSI”这样的字符集。不幸的是,Windows API 指CP_ACP的是“ANSI 代码页”,它指的是几个字符集之一,具体取决于您机器上选择的非 unicode 语言环境。

CP_ACP也就是说,关于您最初的问题,不,您不能总是在Unicode 编码之间往返。CP_ACP例如,在英语语言环境的 Windows 系统上,あ in 没有等价物。

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

于 2012-11-20T07:18:25.933 回答
1

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

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

于 2012-11-20T07:13:25.400 回答