【发布时间】:2016-03-17 07:25:45
【问题描述】:
我有一个 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);
而且它似乎有效.. 但是为什么呢?
documentation 代表codecvt_utf16 状态:
std::codecvt_utf16 是一个 std::codecvt facet,它封装了 UTF-16 编码的字节字符串和 UCS2 或 UCS4 字符串之间的转换(取决于 Elem 的类型)。
据我所知,UCS2 是 unicode 的一个版本。所以这段代码正在转换为代表 unicode 字符的 wchar_t 字节序列,对吗?我怎么会得到 ASCII 字节?
【问题讨论】:
-
@Simple,因为维基百科在解释这一点上很烂,你能扩展一下吗?
-
UCS-2 是一个过时的术语,它指的是 Unicode 1.1 之前的 Unicode 实现,在代理代码点和 UTF-16 被添加到标准的 2.0 版之前。现在应该避免这个词。 UCS-2 没有描述不同于 UTF-16 的数据格式,因为两者都使用完全相同的 16 位代码单元表示。但是,UCS-2 不解释代理代码点,因此不能用于一致地表示补充字符... (unicode.org/faq/utf_bom.html#utf16-11)
-
我认为这段代码不应该按原样编译,因为
converterX.from_bytes()返回一个std::basic_string<wchar_t>,您将其分配给std::string而不是std:::wstring。 -
它适用于在项目窗格 (MSVC) 中选择的 unicode 属性。可能是因为这意味着
std::basic_string<wchar_t>在幕后
标签: c++ unicode encoding utf-8