我正在尝试将少数 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);
答案 0 :(得分:1)
CW2A
是CW2AEX<>
的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。