我在 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
2 回答
该A2T
宏用于将使用相关 ANSI 代码页编码的字符串转换为TCHAR
使用相关 tchar 编码的字符串。由于您已启用“Unicode 字符集”,TCHAR
因此wchar_t
编码为 UTF-16。因此,A2T
宏将字符串从 ANSI 代码页转换为 UTF-16。(如果您将程序设置为使用 ANSI 而不是 Unicode,TCHAR
则为 char,编码为 ANSI 代码页编码,A2T
宏应变为无操作。)
从使用产生正确转换这一事实可以明显看出CP_UTF8
,您的字符串没有使用 ANSI 代码页,而是使用 UTF-8。ANSI 代码页不能设置为 UTF-8,因此A2T
不是适当的转换方法。
您需要分析什么决定了程序中输入字符串的编码以及您需要什么输出编码,然后选择合适的转换例程。
请注意,您不仅仅是在寻找一个例程,该例程可以在您机器上正在使用的编码与您碰巧使用的特定配置中的程序之间进行转换。您正在寻找一个例程,该例程将在任何受支持的机器上的任何受支持的配置下使用适当的编码。即您选择的例程需要根据程序和机器的配置更改它执行的转换。例如,TCHAR
基于程序的函数和宏可以根据程序的配置方式使用不同的编码,但它们总是相互配合,因为它们总是使用一致的TCHAR
编码,无论在任何给定的配置中发生什么。
“unicode 字符集”意味着 Windows API 使用wchar_t
UTF-16 并与您的程序通信。如果您的程序使用“窄”char
字符串,则必须执行转换以从您输入的任何字符集转换为 UTF-16。
“unicode 字符集”不会导致任何内容被解释为 UTF-8。