【问题标题】:MultiByteToWideChar conversionMultiByteToWideChar 转换
【发布时间】:2013-08-22 02:38:56
【问题描述】:

我在 Visual Studio 9.0 上有一个 Visual C++ 应用程序。我们使用“Unicode 字符集”作为字符集构建了应用程序。我们使用 windows API A2T 进行转换,但是多字节字符(韩文)没有得到正确转换。我看到了 A2T 的代码,它使用 CP_THREAD_ACP 作为 MultiByteToWideChar 的第一个参数。当我将 CP_UTF8 用于相同的 API 时,我得到了正确的结果。根据 CP_THREAD_ACP 的评论,它提到了“当前线程的 ANSI 代码页”,即使我已经使用 Unicode 字符集构建了代码,我也不确定为什么 A2T 函数不使用 UTF8

【问题讨论】:

  • utf8everywhere.org 中有一些关于使错误处理 Unicode 的库仍然正常工作的信息。可能会有所帮助。
  • 读得很好

标签: c++ unicode converter


【解决方案1】:

A2T 宏用于将使用相关 ANSI 代码页编码的字符串转换为使用相关 tchar 编码的TCHAR 字符串。由于您启用了“Unicode 字符集”,TCHARwchar_t,编码为 UTF-16。因此,A2T 宏将字符串从 ANSI 代码页转换为 UTF-16。 (如果您将程序设置为使用 ANSI 而不是 Unicode,则 TCHAR 是 char 并且编码是 ANSI 代码页编码,A2T 宏应该成为空操作。)

很明显,使用CP_UTF8 会产生正确的转换,即您的字符串没有使用 ANSI 代码页,而是使用 UTF-8。 ANSI 代码页不能设置为 UTF-8,因此A2T 不是合适的转换方法。


您需要分析什么决定了程序中输入字符串的编码以及您需要什么输出编码,然后选择合适的转换例程。

请注意,您不只是在寻找一个例程,该例程可以在您机器上正在使用的编码与您碰巧使用的特定配置中的程序之间进行转换。您正在寻找一个例程,该例程将在任何受支持的机器上的任何受支持的配置下使用适当的编码。 IE。您选择的例程需要根据程序和机器的配置更改它执行的转换。例如,基于TCHAR 的函数和宏可以根据程序的配置方式使用不同的编码,但它们总是相互配合,因为它们总是使用一致的TCHAR 编码,无论发生在任何给定的配置。

【讨论】:

    【解决方案2】:

    “unicode 字符集”表示 Windows API 使用 wchar_t,并使用 UTF-16 与您的程序通信。如果您的程序使用“窄”char 字符串,则必须执行转换以从您输入的任何字符集转换为 UTF-16。

    “unicode 字符集”不会导致任何内容被解释为 UTF-8。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-30
      • 1970-01-01
      • 2011-10-05
      • 1970-01-01
      • 2016-05-12
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多