gpt4 book ai didi

c++ - CW2A(LPCWSTR)str) 和 CW2A(LPCWSTR)str, CP_UTF8) 有什么区别?

转载 作者:行者123 更新时间:2023-11-30 05:22:59 27 4
gpt4 key购买 nike

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

CW2A((LPCWSTR)some_String);

但是当用于 otherLangString 时,我得到的是“??????”所以为了解决这个问题,我做了这个并且成功了

CW2A(some_String, CP_UTF8);

现在在代码中,除了一个看起来像第二个示例之外,所有转换看起来都像第一个示例。

为了保持一致性,我混合了以上两个,并为所有人都做了这个。

CW2A((LPCWSTR)some_String, CP_UTF8);

我的问题是, following 和 following 之间有什么区别?

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

最佳答案

CW2A CW2AEX<> 的类型定义,它的c'tor是documented .使用 2 个参数的 c'tor 允许您显式指定用于转换的代码页:

nCodePage:
The code page used to perform the conversion. See the code page parameter discussion for the Windows SDK function MultiByteToWideChar for more details.

如果您不指定代码页,则使用当前线程的 ANSI 代码页进行转换(您很少需要那样)。这在 ATL and MFC String Conversion Macros 下进行了解释:

By default, the ATL conversion classes and macros will use the current thread's ANSI code page for the conversion. If you want to override that behavior for a specific conversion using macros based on the classes CA2WEX or CW2AEX, specify the code page as the second parameter to the constructor for the class.

在你的情况下,

CW2A((LPCWSTR)some_String);

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

另一段代码

CW2A(some_String, CP_UTF8);

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


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

关于c++ - CW2A(LPCWSTR)str) 和 CW2A(LPCWSTR)str, CP_UTF8) 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39398621/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com