使用ICU来迭代字符串并检查是否满足适当的Unicode属性。这里是用C来检查UTF-8命令行参数是否是有效的标识符的一个示例:
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <unicode/uchar.h>
#include <unicode/utf8.h>
int main(int argc, char **argv) {
if (argc != 2) return EXIT_FAILURE;
const char *const str = argv[1];
int32_t off = 0;
// U8_NEXT has a bug causing length < 0 to not work for characters in [U+0080, U+07FF]
const size_t actual_len = strlen(str);
if (actual_len > INT32_MAX) return EXIT_FAILURE;
const int32_t len = actual_len;
if (!len) return EXIT_FAILURE;
UChar32 ch = -1;
U8_NEXT(str, off, len, ch);
if (ch < 0 || !u_isIDStart(ch)) return EXIT_FAILURE;
while (off < len) {
U8_NEXT(str, off, len, ch);
if (ch < 0 || !u_isIDPart(ch)) return EXIT_FAILURE;
}
}
注意,这里ICU使用Java的定义,其是从那些UAX #31略有不同。在真正的应用程序中,您可能还想在之前将其规范化为NFC。
Unicode标准包含有关编程语言中'标识符'应允许使用哪些字符的指导原则。 C++实际上被指定遵循这些guildlines,虽然在实际的实现中支持仍然很不明显。除了标识符和特定文字之外,您不必对字符进行分类,因为您几乎完全指定了每个标记。 – bames53 2013-04-07 01:46:42
我在哪里可以找到这些指导?是否有任何C++函数,用于检查specyfic字符是否可用于编程语言中的“标识符”(根据规范)? – 2013-04-07 02:12:35
这是关于测试有效的* C++标识符字符*或有效的*字母字符*的问题吗? – 2013-04-07 03:58:59