CW2A(LPCWSTR)str)和CW2A(LPCWSTR)str, CP_UTF8)之间的区别是什么?

What is difference between CW2A(LPCWSTR)str) and CW2A(LPCWSTR)str, CP_UTF8)?

本文关键字:CW2A str LPCWSTR 区别 是什么 之间 CP UTF8      更新时间:2023-10-16

我正试图将几个CStringW字符串转换为CStringA字符串。其中一个字符串(我们称之为otherLangString)是其他语言(中文,阿拉伯语等)。当像这样使用时,所有其他字符串都没有转换问题:

CW2A((LPCWSTR)some_String);

但是当用于otherLangString时,我得到"?????"为了解决这个问题,我这样做了

CW2A(some_String, CP_UTF8);

现在在代码中一些所有的转换看起来像第一个样本,除了一个看起来像第二个样本。

为了保持一致性,我将以上两种方法混合,并对所有方法都这样做。

CW2A((LPCWSTR)some_String, CP_UTF8);

我的问题是,以下的区别是什么?

- CW2A((LPCWSTR)some_String, CP_UTF8) and CW2A(some_String, CP_UTF8);
- CW2A((LPCWSTR)some_String) and CW2A(some_String, CP_UTF8);

CW2ACW2AEX<>的类型定义,并且它的c'tor是文档化的。接受2个参数的c'tor允许您显式指定用于转换的代码页:

nCodePage:
用于执行转换的代码页。有关详细信息,请参阅Windows SDK函数MultiByteToWideChar的代码页参数讨论。

如果不指定代码页,则使用当前线程的ANSI代码页进行转换(您很少希望这样)。这在ATL和MFC字符串转换宏中有解释:

默认情况下,ATL转换类和宏将使用当前线程的ANSI代码页进行转换。如果您希望使用基于类CA2WEXCW2AEX的宏来覆盖特定转换的行为,请将代码页指定为该类构造函数的第二个参数。

对你来说,

CW2A((LPCWSTR)some_String);

使用线程当前的ANSI代码页,将UTF-16转换为窄字符串。只有在使用相同的ANSI代码页进行解释时,结果才有意义。更糟糕的是,ANSI代码页编码的字符串不能表示所有Unicode字符。

另一段代码

CW2A(some_String, CP_UTF8);

从UTF-16转换为UTF-8。这通常是有利的,因为转换是无损且显式的。两种编码都可以表示同一组字符。编码后的字符串可以被任何能够解释UTF-8的阅读器解码。


注意:一般情况下,在Windows中不能直接使用存储在CStringA中的UTF-8编码字符串。通过网络发送内容或将其写入磁盘是安全的。但是如果你想将它传递给Windows API(例如用于显示),你必须首先转换为UTF-16。Windows API的ANSI版本不支持UTF-8