有什么方法可以确定我的 std::string 将使用哪种特定编码?如果字符串看起来像这样 std::string("This is a test");
而另一个将使用非 ASCII 符号,那么如何从 std::string 位置处理它像 std::string("This is a russian alphabet: Ребята сдохли");
?我需要知道这一点,这样我才能将这种类型的带有“const char*”作为构造函数参数的字符串转换为 UTF-8 编码的 std::string。
最佳答案
没有 std::string
编码这样的东西。 std::string
包含字节。时期。它是一个 std::vector<char>
,带有一些 ASCII 友好的辅助函数。
这些字节可能会以近乎无限的方式被解释——如 ASCII、UTF-8、Shift-JIS……在某些情况下,如果你对问题域有足够的了解,你可以猜测编码,以及 you could do things like looking for a UTF-8 BOM at the start ,但是没有一个并不意味着字符串不是 UTF-8 并且一个的存在甚至不一定意味着它是 - 它可能是一些恰好看起来像 BOM 的字节(链接的答案似乎很乐观大部头书)。一般来说,这就像试图从水中提取油。
如果你需要知道你接收到的字节序列的编码,你需要发送它们的实体来告诉你编码是什么(一些 Exif 字段在 ASCII 中使用一个 8 字符的标签前缀来宣布对文本 block 的其余部分进行编码),或者以其他方式记录双方将使用的协议(protocol),例如UTF-8,然后要求遵守此协议(protocol),如果遇到不兼容的字节序列,则踢出错误消息/异常。
就我个人而言,我倾向于在我的整个应用程序中采用 ASCII 或 UTF-8(根据需要),如果我从已知编码为其他内容的源获取文本,则在输入点进行转换。
也不要忘记,如果您的字符串不是 ASCII(或其他单字节编码),那么对其进行元素操作将无法正常工作。您需要一个库来解释字符串的组件、编码域 字符 并在该分辨率下工作,而不是在字节级别工作。存在大量现有的体面库来管理各种 Unicodey 编码。
关于c++ - 如何在 MSVC 中的原始字符串文字中使用 Unicode 符号/表情符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53517555/