CW2A(LPCWSTR)str)和CW2A(LPCWSTR)str, CP_UTF8)之间的区别是什么?
What is difference between CW2A(LPCWSTR)str) and CW2A(LPCWSTR)str, CP_UTF8)?
我正试图将几个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);
CW2A
是CW2AEX<>
的类型定义,并且它的c'tor是文档化的。接受2个参数的c'tor允许您显式指定用于转换的代码页:
nCodePage:
用于执行转换的代码页。有关详细信息,请参阅Windows SDK函数MultiByteToWideChar的代码页参数讨论。
如果不指定代码页,则使用当前线程的ANSI代码页进行转换(您很少希望这样)。这在ATL和MFC字符串转换宏中有解释:
默认情况下,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。Windows API的ANSI版本不支持UTF-8 - Python str to C++ to Python str
- 为什么无论你输入什么,这"while(cin.get(str,3))"只运行一次?
- 字符串变量,比如说"字符串str",可以直接复制到数组中吗?
- 解释一下 for (char c : str) 的作用?
- 返回 str vs. str.substr(0,str.size()) 在 leetcode 中给了我不同的输出
- remove(str.begin(), str.end(), );无法正常工作(我正在使用视觉工作室 2012)
- Getline(cin,str)的奇怪输出
- 比使用 s.str().c_str() 更好的表达?
- 除以 str.length() 什么也没显示
- 没有'str'成员在 GCC 和 Clang 'std::basic_ostream<char>',但 MSVC 没有问题
- 我可以得到一个字符 * 到一个 std::sregex_iterator 匹配 str() 吗?
- C6001:使用单元化内存"str[i]"
- 而(getline(fin,str)){}即使在到达eof之后仍在处理数据
- 在给定的代码中,有人可以解释一下(int i = 0; i<len; i++)count[str[i]]++的代码片段;
- 在函数内部传递字符 *str
- rdbuf()->str()在哪里?
- std::smatch str() 未返回正确的字符串
- 这是 boost::filesystem 中的错误吗?为什么 boost::filesystem::p ath::str
- STR这个实现是否安全且可移植?
- CW2A(LPCWSTR)str)和CW2A(LPCWSTR)str, CP_UTF8)之间的区别是什么?