【发布时间】:2017-11-22 03:19:59
【问题描述】:
我有一个 UTF-8 字符串,它以 null 结尾的 const char* 形式给出。我想知道这个字符串的第一个字母本身是否是a。以下代码
bool f(const char* s) {
return s[0] == 'a';
}
错误,因为字符串的第一个字母(字形簇)可能是 à - 由 2 个 unicode 标量值组成:a 和 `。所以这个非常简单的问题似乎很难回答,除非你知道字素簇是如何产生的。
不过,许多库解析 UTF-8 文件(例如 YAML 文件),因此应该能够回答此类问题。但这些库似乎并不依赖于 Unicode 库。
所以我的问题是:
如何编写检查字符串是否以字母
a开头的代码?假设第一个问题没有简单的答案,解析器(如 YAML 解析器)如何在无法回答此类问题的情况下解析文件?
【问题讨论】:
-
为什么那些库需要了解字素簇?文本序列化倾向于根据代码点来定义。无法想象 YAML 是个例外。
-
解析和验证 utf-8 以及正确解释它是有区别的。前者容易,后者不那么容易。
-
将 UTF-8 解码为 Unicode,normalize it 使用 NFC 或 NFKC 以减少组合标记,然后根据需要测试标准化数据。