如何在MSVC中的原始字符串文字中使用Unicode符号/表情符号

时间:2018-11-28 10:42:49

标签: c++ windows encoding character-encoding

有什么方法可以确定我的std :: string使用哪种特定编码?如果字符串看起来像这样std::string("This is a test");,而另一个将使用像std::string("This is a russian alphabet: Ребята сдохли");这样的非ASCII符号,那么如何从std :: string位置处理呢?我需要知道这一点,以便可以将这种类型的字符串以“ const char *”作为构造函数参数转换为UTF-8编码的std :: string。

2 个答案:

答案 0 :(得分:2)

没有std::string编码之类的东西。 std::string包含字节。期。这是std::vector<char>,带有一些ASCII友好的帮助函数。

这些字节可能以几乎无限的方式进行解释-ASCII,UTF-8,Shift-JIS ...在某些情况下,如果您对问题域了解足够,就可以猜测一下编码,而{{ 3}},但是缺少一个并不意味着字符串不是UTF-8,而即使存在一个字符串也不一定意味着它是UTF-8,这可能是某些字节看起来像BOM(链接的答案对我来说似乎很乐观)。一般来说,这就像试图从水中取油。

如果您需要知道接收到的字节序列的编码,则需要发送它们的实体来告诉您该编码是什么(某些Exif字段使用ASCII中的8个字符的标记前缀来声明编码文本块的其余部分),或记录两端使用的协议,例如UTF-8,然后要求遵守此协议,如果遇到不兼容的字节序列,则踢出错误消息/异常。

我个人倾向于在整个应用程序中采用ASCII或UTF-8(根据需要),如果从已知编码为其他内容的来源获取文本,则在输入时进行转换。

也不要忘记,如果您的字符串不是ASCII(或其他单字节编码),则对其进行元素操作将无法正常工作。您需要一个库来解释字符串的组成部分,编码域 characters ,并以该分辨率而不是字节级别工作。存在大量现有的体面的库来管理各种Unicodey编码。

答案 1 :(得分:1)

我的问题的解决方案是#pragma execution_character_set("utf-8")。这行代码使我能够使用类似string data("");这样的字符串,并且MSVS已将其正确编码为something like this