C++ - 将 std::wstring 转换为 std::string - 用作 std::map 键的快速脏方法转换

6
我需要一些关于将std::wstring转换为std::string的建议,但只是作为一个键在std::map<std::string, int>对象中进行快速而简单的转换。
这个映射表相当大,并且已经很好地集成到项目中了。只有少数几个键需要进行此转换,因此我认为将映射表更改为接受std::wstring作为键会很浪费。
转换的输出并不重要,但必须保持一致,以便每次可靠地从映射表中提取正确的值。
该应用程序仅适用于Windows操作系统。
是否有任何已知的方法可以可靠地进行粗略转换以实现此目的?或者最好通过通常的、正确的转换过程(如在此SO问题/答案中描述的:How to convert wstring into string?)进行转换? 编辑: 请记住 - 只要事情保持一致,丢失信息是可以接受的。也就是说,如果我插入一些日语字符,并且它们始终转换为相同的(可能是垃圾)std :: string ,那就没问题了。这永远不会用于显示,只用作从地图中提取值的关键字。

谢谢!


一个适配器 - krlmlr
2
也许你应该将 std::wstring 转换为 UTF-8,并将 std::string 设置为该值。这样可以避免出现多余的 '\0' 字节。 - Brett Hale
为什么你还要使用std::wstring在任何地方都应该使用UTF8。 - Arne Mertz
@Arne Mertz:感谢您提供那篇文章的链接。很有趣的阅读。但是回答您的问题:在这种情况下没有选择:P - Jace
3个回答

11

作为一个变体,我会选择

std::wstring w( L"Some" );
std::string s( w.begin(), w.end() );

也许另一个答案更快(取决于字符串迭代器的实现),但对我来说这是一种更符合std\stl方式的方法。但是,是的,这将失去一些独特的字符。


1
在进行字符串转换时,有时会丢失一些字符,但通常这并不是什么大问题! ;) - Andreas
如果您仔细阅读问题,它要求进行“快速而肮脏的转换”,并且“转换的输出实际上并不重要”,只要“它是一致的”即可。此外,还有一个完整的编辑添加部分,其中描述了“失去信息是可以接受的,只要事情保持一致”,并且“转换为相同的(可能是垃圾)字符串”,还有“这永远不会用于显示”。 - Roman Kruglov
1
不要这样做。这仅适用于英文。它会破坏中文、日文等文字。 - Katsutoshi Hayashida

10
如果您只是希望内容可比较而不关心其语义,我将把内部的wchar[]强制转换成双倍大小的char[],并将其用于初始化字符串(通过在构造函数中指定地址/大小)。
std::wstring ws(L"ABCD€FG");
std::string s((const char*)&ws[0], sizeof(wchar_t)/sizeof(char)*ws.size());

现在 s 是无法打印的(可能包含空字符),但仍可分配和比较。

你可以回退到:

std::wstring nws((const wchar_t*)&s[0], sizeof(char)/sizeof(wchar_t)*s.size());

现在进行比较

std::cout << (nws==ws)

应该输出1

然而需要注意的是,由于存在0,使用这种方式的映射顺序(即operator<的结果)是不确定的,而且不反映任何文本语义。然而搜索仍然有效,因为-虽然模糊-它仍然是一种“顺序”。


1
这会分散 OP 的注意力:显然,重点并不是要获得漂亮的输出,而是要检查在循环期间是否出现信息丢失。任何根据等式变化的输出都是相同的。我使用了更短、更简单的方法,不需要额外的头文件。至于 OP,他需要找到最适合自己需求的“美化器”(包括将 cout 替换为 MessageBox 或其他显示他想要的东西的对话框)。 - Emilio Garavaglia
2
如果这是一个unordered_map,我会担心字符串中的空字节。如果哈希函数专门针对字符串进行了特殊处理,它可能会或可能不会尊重实际的std::string大小,而是在第一个空字节处停止。 - Adrian McCarthy

8
你可以将std::wstring转换为utf-8(使用WideCharToMultiByte或类似的库,比如这个:http://utfcpp.sourceforge.net/),也就是一个以空字符结尾的c字符串,然后从中构造std::string。这种转换是可逆的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接