【问题标题】:ANSI to Unicode or backward conversion: how is it possible to do?ANSI 到 Unicode 或向后转换:怎么可能?
【发布时间】:2012-11-20 06:59:12
【问题描述】:

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

现在我不明白 A2WW2A 是如何工作的。 问题是,当您将某物转换为另一物时,您应该设置两个集合A 和集合B,以便集合A 中的每个元素都映射到集合@987654331 中的一个且只有一个元素@ uniquely。 关于这一点有几个问题:

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

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

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

【问题讨论】:

  • 1. “ANSI”和“Unicode”不是编码。 2. 转换 API 必须告诉您一切正常。 (或者,我想,你可以往返并比较。)
  • 没有正确称为“ANSI”的字符集。 Windows-1252 代码页及其亲属通常错误地称为 ANSI;有关详细信息,请参阅链接的 Wikipedia 文章。而在 Windows 中,“Unicode”这个名称通常用来指代 UTF-16,它只是 Unicode 的几种表示形式之一。

标签: c++ unicode ansi


【解决方案1】:

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

也就是说,关于您最初的问题,不,您不能总是在 CP_ACP 和 unicode 编码之间往返。例如,在英语区域设置的 Windows 系统上,CP_ACP 中的 あ 没有等效项。

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

【讨论】:

  • 这意味着在我使用 W2A 转换的地方,我应该确保所有字符都来自char 的范围,只是它们由两个字节表示?
  • @Narek,不,仅适用于某些单字节代码页,其中较低的 256 个代码点直接映射到相同编号的 unicode 代码点。例如,在 shift-jis 中,在 U+0000 和 U+00FF 之间存在不可表示的代码点(特别是 U+005F ~ 和 U+005C \,但大多数也高于 U+0080)。跨度>
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-20
    • 1970-01-01
    • 2017-11-29
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    相关资源
    最近更新 更多