我有一个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
州的
std :: codecvt_utf16是一个std :: codecvt facet,它封装了UTF-16编码的字节串和UCS2或UCS4字符串之间的转换(取决于Elem的类型)。
据我所知,UCS2是unicode的一个版本..所以这段代码转换为代表unicode字符的wchar_t
字节序列对吗?为什么我得到ASCII字节?
答案 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。