为什么我不能将带有破折号的字符串转换为 wstring?

Why cannot I convert a string with an en dash into a wstring?

以下代码失败,我似乎无法弄清楚原因。

std::string s = "–";
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
std::wstring wide = converter.from_bytes(s);

我尝试阅读有关 UTF-8 的内容,但我无法理解。将初始字符串存储为 wstring,将其转换为字符串,然后再将其转换回给出正确的结果。

std::wstring ws = L"–";
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
std::string narrow = converter.to_bytes(ws);
std::wstring wide = converter.from_bytes(narrow);

最有可能的是,您的 C++ 源文件未保存为 UTF-8,或者编译器未将其解释为 UTF-8,无论哪种方式都会导致 "–" 实际上不表示 U+2013 EN DASH运行。您可以在运行时轻松验证这一点,例如使用调试器,或者只是打印出 string.

的原始字节

确保您的 C++ 文件以 UTF-8 格式保存,并编译为 UTF-8。或者尝试使用此代码:

std::string s = u8"–";

或者:

std::string s = "\xE2\x80\x93";