C++ 扩展';isalnum';识别UTF-8 umlaut
我编写了一个扩展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 // Ä |
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对字母数字的理解可能不够明确。