C++ 扩展';isalnum';识别UTF-8 umlaut

C++ 扩展';isalnum';识别UTF-8 umlaut,c++,utf-8,C++,Utf 8,我编写了一个扩展isalnum的函数来识别UTF-8编码的umlaut 有没有更优雅的方法来解决这个问题 代码如下: bool isalnumlaut(const char character) { int cr = (int) (unsigned char) character; if (isalnum(character) || cr == 195 // UTF-8 || cr == 132 // Ä |

我编写了一个扩展isalnum的函数来识别UTF-8编码的umlaut

有没有更优雅的方法来解决这个问题

代码如下:

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;
    }
}
编辑:


我现在已经测试了我的解决方案好几次了,但它似乎符合我的目的。有什么强烈的反对意见吗?< /P> < P> >我不确定100%,但C++ <代码> STD::ISALNUM <代码> >代码> >代码>几乎肯定地认识到特定于区域的附加字符:

,您定义的接口是不可能的,因为UTF-8是一个A. 多字节编码;单个字符需要多个
字符才能
代表它。(我有确定UTF-8是否为
我的库中指定字符集的成员,但

字符由一对迭代器指定,而不是单个的
char

您的代码不符合您的要求

Ä
的utf-8表示为两个字节-
0xC3,0x84
。值高于
0x7F
的单字节在utf-8中没有意义


一些一般性建议:

  • Unicode很大。考虑使用已经处理了您所看到的问题的库,例如.
  • 函数在单个代码单元或代码点上运行通常没有意义。让函数在代码点范围或单个glyph上运行更有意义(有关这些术语的定义,请参阅)

  • 对于与通用字符集一样大的字符集,字母数字的概念可能没有得到充分的说明;是否将西里尔字母表中的字符视为字母数字?Unicode关于字母的概念可能与你的不符——特别是如果你没有考虑过的话


UTF-8是一种Unicode编码。Unicode中有几十个UMLAUT。特别是,Unicode有一个“独立”unlaut,U+0308。它将umlaut添加到前面的字符。即U+0041 U+0308为Ä。还有,为什么ß在这个列表中?我想你指的是组合,而不是“独立”。(官方上,它是一个“分音符”,而不是一个“Umlaut”——单词“Umlaut”指的是它对德语发音的影响。)Unicode既有组合分音符,也有间距分音符(U+00A8),加上大约80个使用分音符的“预组合”字符。(grep DIAERESIS UnicodeData.txt的结果)@James:当然。但考虑到问题的措辞,我没有使用正式术语。顺便说一句,您还可能在该计数中包含了“下面的重分类”(U+0324),以及预合成用途,例如Ṳ U+1E72@MSalters我知道。我唯一真正想知道的是“独立”(对我来说,这是组合的相反意思)。剩下的只是附加信息。
std::isalnum
函数不适用于UTF-8等多字节编码。不管语言环境如何。仅仅看一个
char
是不够的。您必须查看整个字符(在UTF-8中最多可以使用四个
char
)。特别是,Unicode字符类别
字母
数字类型
(来自UAX#44)将合理地涵盖
isalnum()
@MSalters:Good point。我已经澄清了语言,明确指出OP对字母数字的理解可能不够明确。