MultiByteToWideChar conversion

MultiByteToWideChar conversion

本文关键字:conversion MultiByteToWideChar      更新时间:2023-10-16

我在Visual Studio 9.0上有一个Visual C++应用程序。我们使用"Unicode字符集"作为字符集构建了该应用程序。我们使用windows API A2T进行转换,但多字节字符(朝鲜语文本)无法正确转换。我看到了A2T的代码,它使用CP_THREAD_ACP作为MultiByteToWideChar的第一个参数。当我为同一个API使用CP_UTF8时,我得到了正确的结果。根据CP_THREAD_ACP的注释,它提到了"当前线程的ANSI代码页",尽管我已经用Unicode字符集构建了代码,但我不确定为什么A2T函数不使用UTF8

A2T宏用于将使用相关ANSI代码页编码的字符串转换为使用相关tchar编码的TCHAR字符串。由于您启用了"Unicode字符集",因此TCHARwchar_t,编码为UTF-16。因此A2T宏将ANSI代码页中的字符串转换为UTF-16。(如果将程序设置为使用ANSI而不是Unicode,则TCHAR为char,编码为ANSI代码页编码,A2T宏应成为no-op。)

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


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

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

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

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