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

时间:2016-09-08 19:16:53

标签: c++ mfc atl

我正在尝试将少数 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);

1 个答案:

答案 0 :(得分:1)

CW2ACW2AEX<>的typedef,它的c是documented。使用2个参数的c允许您明确指定用于转换的代码页:

  

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

如果您没有指定代码页,则当前线程的ANSI代码页用于转换(您很少需要)。这在ATL and MFC String Conversion Macros

下进行了解释
  

默认情况下,ATL转换类和宏将使用当前线程的ANSI代码页进行转换。如果要根据类 CA2WEX CW2AEX 使用宏覆盖特定转换的行为,请将代码页指定为类的构造函数的第二个参数。

在你的情况下,

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。 ANSI API的Windows API不支持UTF-8。