了解unicode codecvt

时间:2015-12-11 11:32:14

标签: c++ unicode encoding utf-8

我有一个UTF-16编码流,我想将其转换为纯ASCII,即如果有ASCII字符 - >打印出来。如果代码单元代表其他我不关心的东西,例如中文字符) - >输出垃圾。

我正在使用此代码

typedef std::codecvt_utf16<wchar_t> convert_typeX;
std::wstring_convert<convert_typeX, wchar_t> converterX;
std::string converted = converterX.from_bytes(str);

它似乎有用..但为什么?

codecvt_utf16州的

documentation

  

std :: codecvt_utf16是一个std :: codecvt facet,它封装了UTF-16编码的字节串和UCS2或UCS4字符串之间的转换(取决于Elem的类型)。

据我所知,UCS2是unicode的一个版本..所以这段代码转换为代表unicode字符的wchar_t字节序列对吗?为什么我得到ASCII字节?

1 个答案:

答案 0 :(得分:2)

关于unicode的好处是unicode值0-127代表ASCII字符0-127。

所以,你甚至不需要浪费时间std::codecvt。您所要做的就是扫描您的UTF-16序列,获取0-127范围内的所有UTF-16值(有关从字节流中提取UTF-16值的简单过程,请参阅UTF-16的维基百科条目),并且你最终会使用纯ASCII,就像魔法一样。这是因为根据定义,127以上的值不是纯ASCII。你可以用所有其他角色做任何你想做的事。

而且,如果您希望将Universe扩展为iso-8859-1,而不是US-ASCII,则可以将范围扩展为0-255。因为unicode值128-255也等同于iso-8859-1代码集中的字符128-255。