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

Dyo*_*sos 2 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:

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

Joe*_*oeG 5

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

utf-8表示Ä是两个字节 - 0xC3,0x84.0x7F在utf-8中,具有上述值的单个字节无意义.


一些一般性建议:

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

  • 函数在单个代码单元代码点上操作通常没有意义.拥有对代码点范围或单个字形进行操作的函数更有意义(有关这些术语的定义,请参见此处).

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