gpt4 book ai didi

c++ - 了解 unicode codecvt

转载 作者:搜寻专家 更新时间:2023-10-31 02:18:46 27 4
gpt4 key购买 nike

我有一个 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 is a std::codecvt facet which encapsulates conversion between a UTF-16 encoded byte string and UCS2 or UCS4 character string (depending on the type of Elem).

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

最佳答案

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

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

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

关于c++ - 了解 unicode codecvt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34222576/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com