我在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
答案 0 :(得分:2)
A2T
宏用于使用相关的tchar编码将使用相关ANSI代码页编码的字符串转换为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
编码,无论发生什么在任何给定的配置中。
答案 1 :(得分:1)
“unicode字符集”表示Windows API使用wchar_t
,并使用UTF-16与您的程序通信。如果您的程序使用“窄”char
字符串,则必须执行转换以将您输入的任何字符集转换为UTF-16。
“unicode character set”不会导致任何东西被解释为UTF-8。