有几个函数可以将ANSI转换为Unicode,反之亦然。以下是这些函数WideCharToMultiByte
,MultiByteToWideChar
,A2W
,W2A
。
现在我不明白A2W
和W2A
的工作原理。 问题是,当您将某些内容转换为其他内容时,您应该将两个集合设置为A
并设置B
,以便将集合A
中的每个元素映射到一个且仅唯一地设置B
中的一个元素。关于此,有几个问题:
ANSI是一个字节,UNICODE至少是2个字节,这意味着UNICODE集中的所有元素都不能唯一地映射到ANSI。
设置ANSI
并且未严格定义Unicode
。我的意思是两者都有不同的编码。
在此,我的问题是:我们如何转换它们并确保我们没有破坏数据?
答案 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)
进行往返转换,然后将结果与原始结果进行比较。
如果您愿意,可以调用转换函数,以便为未定义的结果抛出错误。