有几个函数可以将 ANSI 转换为 Unicode,反之亦然。下面是那些函数WideCharToMultiByte, MultiByteToWideChar, A2W, W2A。
现在我不明白如何A2W和W2A工作。问题是,当您将某物转换为另一物时,您应该有两个 setA和 set,B以便set中的每个元素A都B唯一地映射到set中的一个且只有一个元素。对此,有几个问题:
ANSI 是一个字节,而 UNICODE 至少是 2 个字节,这意味着并非 UNICODE 集中的所有元素都可以唯一地映射到 ANSI。
SetANSI和 setUnicode没有严格定义。我的意思是两者都有不同的编码。
在此,我的问题是:我们如何转换它们并确保我们没有破坏数据?
正如其他人所提到的,没有像“ANSI”这样的字符集。不幸的是,Windows API 指的是CP_ACP“ANSI 代码页”,它指的是几个字符集之一,具体取决于在您的机器上选择的非 unicode 语言环境。
也就是说,关于您的原始问题,不,您不能总是在CP_ACPUnicode 编码和 Unicode 编码之间往返。没有等价的?例如,CP_ACP在英语语言环境 Windows 系统中。
发生这种情况时,WideCharToMultiByte将用 替换没有等效项的字符lpDefaultChar,如果设置,并设置*lpUsedDefaultChar为 true。您可以传递一个指向布尔变量的指针,lpUsedDefaultChar并在调用后检查它以查看您的字符串是否包含不可翻译的字符。但是,MultiByteToWideChar只要输入在您的本地代码页中有效,另一个方向就永远不会失败。要尝试检测无效文本,请传入MB_ERR_INVALID_CHARS标志并检查错误 - 也就是说,仅仅因为文本在其他代码页中,并不意味着您会从中得到错误(很难判断文本是否实际上是无效的,或者只是胡言乱语)。