Ins*_*oop 3 c unicode utf-8 grapheme
我有一个以空终止的UTF-8字符串const char*.我想知道这个字符串的第一个字母是a单独的.以下代码
bool f(const char* s) {
return s[0] == 'a';
}
Run Code Online (Sandbox Code Playgroud)
是错误的,因为字符串的第一个字母(字形集群)可能是à- 由2个unicode标量值组成:a和`.所以这个非常简单的问题似乎很难回答,除非你知道如何制作字形集群.
尽管如此,许多库解析UTF-8文件(例如YAML文件),因此应该能够回答这类问题.但是这些库似乎并不依赖于Unicode库.
所以我的问题是:
如何编写检查字符串是否以字母开头的代码a?
假设第一个问题没有简单的答案,解析器(如YAML解析器)如何设法解析文件而不能回答这类问题?
这没关系.
考虑一下:这个字符串是否有效JSON?
"?"
Run Code Online (Sandbox Code Playgroud)
(那是字节序列22 cc 80 22.)
你似乎在争论它不是:因为JSON字符串应该以"(QUOTATION MARK)开头,而是以"?(QUOTATION MARK + COMBINING GRAVE ACCENT)开头.
唯一合理的反应是您正在考虑错误的级别:文本序列化是根据代码点定义的.Grapheme集群仅用于处理自然语言和编辑文本.
这当然被认为是有效的JSON.
>>> json.loads(bytes.fromhex('22cc8022'))
'?'
Run Code Online (Sandbox Code Playgroud)