如何在保留(非)字母数字属性的同时将多字节UTF-8字符表示转换为一个字节?

时间:2011-03-11 17:22:14

标签: c unicode utf-8

我有一个UTF-8字符串作为char*。为了获得每个字符一个字节属性(因此可以通过字符索引随机访问字符串)我目前只是从中删除所有UTF-8连续字节(我想避免“正确” “转换为静态字节宽度表示。”

我希望能够检查给定的多字节UTF-8字符是否为字母数字(或不是),而不是删除所有连续字节,然后用相应的ASCII字符替换它(假设a对于字母数字和.否则)。我该怎么做?

3 个答案:

答案 0 :(得分:2)

一般情况下无法做到这一点,因为ASCII范围之外的字母(例如α)也可能被重音(ἄ)。但是您可以应用NFD Unicode normalization将重音代码点分解为其组成部分,然后检查组件是否位于ASCII范围内。 ICU有normalization support

答案 1 :(得分:2)

对于字符串中的每个字节:

  • 如果是ASCII字节,只需复制即可。
  • 如果是UTF-8头字节,使用wchar_t从该字节开始解码为mbrtowc,通过比较isw*()函数的结果来确定其分类匹配的ASCII字符,并将该ASCII字符复制到输出中。
  • 如果是其他任何内容,请跳过它。

答案 2 :(得分:0)

Unicode总共有1114111(0x10FFFF)作为最高代码点,这意味着几乎超过一百万个字符。单字节可以表示256个字符。

如此简单的答案就是你不能这样做。

据我所知,您希望这可以随机访问字符串中的字符。您使用32位字符。 (纠正我,如果我错了)。

而不是通过编写代码使用ICU并使用转换器convert it into UTF-32(4字节字符)来处理它。 ucnv_convertEx是用于此目的的函数。