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

Posted

技术标签:

【中文标题】为啥我不能将带有破折号的字符串转换为 wstring?【英文标题】:Why cannot I convert a string with an en dash into a wstring?为什么我不能将带有破折号的字符串转换为 wstring? 【发布时间】:2021-07-27 03:56:37 【问题描述】:

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

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);

【问题讨论】:

128 之后的所有扩展 ascii 字符似乎都会出现问题 我从***.com/a/18597384/6368600 获取了代码,根据它应该可以工作。 【参考方案1】:

很可能,您的 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";

【讨论】:

以上是关于为啥我不能将带有破折号的字符串转换为 wstring?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Xaringan 幻灯片中没有出现智能引号和破折号?

从十六进制转换为字符串

Apache - 将下划线转换为标题中的破折号

带有破折号/连字符的架构名称 i HyperSQL

如何在 JavaScript 中将驼峰式字符串转换为破折号?

为啥使用 Convert.FromBase64String(...) 将字符串转换为 byte[] 时,我不能放两个相同的字符? [复制]