我有一个UTF-8字符串作为char*
。为了获得每个字符一个字节属性(因此可以通过字符索引随机访问字符串)我目前只是从中删除所有UTF-8连续字节(我想避免“正确” “转换为静态字节宽度表示。”
我希望能够检查给定的多字节UTF-8字符是否为字母数字(或不是),而不是删除所有连续字节,然后用相应的ASCII字符替换它(假设a
对于字母数字和.
否则)。我该怎么做?
答案 0 :(得分:2)
一般情况下无法做到这一点,因为ASCII范围之外的字母(例如α)也可能被重音(ἄ)。但是您可以应用NFD Unicode normalization将重音代码点分解为其组成部分,然后检查组件是否位于ASCII范围内。 ICU有normalization support。
答案 1 :(得分:2)
对于字符串中的每个字节:
wchar_t
从该字节开始解码为mbrtowc
,通过比较isw*()
函数的结果来确定其分类匹配的ASCII字符,并将该ASCII字符复制到输出中。答案 2 :(得分:0)
Unicode总共有1114111(0x10FFFF)作为最高代码点,这意味着几乎超过一百万个字符。单字节可以表示256个字符。
如此简单的答案就是你不能这样做。
据我所知,您希望这可以随机访问字符串中的字符。您使用32位字符。 (纠正我,如果我错了)。
而不是通过编写代码使用ICU并使用转换器convert it into UTF-32(4字节字符)来处理它。 ucnv_convertEx是用于此目的的函数。