【问题标题】:Understanding unicode codecvt了解 unicode 编解码器
【发布时间】: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&lt;wchar_t&gt;,您将其分配给std::string 而不是std:::wstring
  • 它适用于在项目窗格 (MSVC) 中选择的 unicode 属性。可能是因为这意味着 std::basic_string&lt;wchar_t&gt; 在幕后

标签: c++ unicode encoding utf-8


【解决方案1】:

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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-19
    • 2012-04-10
    • 1970-01-01
    • 2012-11-26
    • 2018-04-11
    • 2021-12-13
    • 2012-01-28
    • 2014-06-26
    相关资源
    最近更新 更多