扩展'isalnum'以识别UTF-8变音符号

时间:2011-10-11 13:27:39

标签: c++ utf-8

我编写了一个扩展isalnum以识别UTF-8编码变音符号的函数。

是否有更优雅的方法可以解决这个问题?

代码如下:

bool isalnumlaut(const char character) {
    int cr = (int) (unsigned char) character;
    if (isalnum(character)
            || cr == 195 // UTF-8
            || cr == 132 // Ä
            || cr == 164 // ä
            || cr == 150 // Ö
            || cr == 182 // ö
            || cr == 156 // Ü
            || cr == 188 // ü
            || cr == 159 // ß
    ) {
        return true;
    } else {
        return false;
    }
}

修改

我现在多次测试我的解决方案,但它似乎为我的目的做了工作。有强烈的反对意见吗?

3 个答案:

答案 0 :(得分:5)

您的代码不符合您的要求。

Ä的utf-8表示是两个字节 - 0xC3,0x84。在utf-8中,值大于0x7F的单个字节无意义。


一些一般性建议:

  • Unicode很大。考虑使用已经处理过您遇到的问题的库,例如ICU

  • 函数在单个代码单元代码点上运行通常没有意义。拥有可在任意代码点范围或单个字形上运行的函数更有意义(有关这些术语的定义,请参阅here)。

  • 对于与通用字符集一样大的字符集,您的字母数字概念可能不够明确;你想把西里尔字母中的字符视为字母数字吗? Unicode的字母概念可能与你的不匹配 - 特别是如果你没有考虑它。

答案 1 :(得分:1)

我不是100%肯定,但std::isalnum中的C ++ <locale>几乎肯定会识别特定于语言环境的其他字符:http://www.cplusplus.com/reference/std/locale/isalnum/

答案 2 :(得分:1)

使用您定义的界面是不可能的,因为UTF-8是一个 多字节编码;单个字符需要多个char 代表它。 (我有用于确定UTF-8是否为a的代码 我的库中指定字符集的成员,但是 character由一对迭代器指定,而不是一个char。)