c - 如何检查 UTF-8 字符串是否以 'a' 开头

标签 c unicode utf-8 grapheme

我有一个以 null 结尾的 const char* 形式给出的 UTF-8 字符串。我想知道这个字符串的第一个字母本身是否是一个a。以下代码

bool f(const char* s) {
  return s[0] == 'a';
}

是错误的,因为字符串的第一个字母(字素簇)可能是 à - 由 2 个 unicode 标量值组成:a`。所以这个非常简单的问题似乎很难回答,除非你知道字素簇是如何形成的。

尽管如此,许多库都会解析 UTF-8 文件(例如 YAML 文件),因此应该能够回答此类问题。但是这些库似乎并不依赖于 Unicode 库。

所以我的问题是:

  • 如何编写代码来检查字符串是否以字母 a 开头?

  • 假设第一个问题没有简单的答案,解析器(例如 YAML 解析器)如何在无法回答此类问题的情况下解析文件?

最佳答案

根本没关系。

考虑:这个字符串是有效的 JSON 吗?

"̀"

(这是字节序列22 cc 80 22。)

你似乎在争论它不是:因为 JSON 字符串应该以 " (QUOTATION MARK) 开头,但它以 (QUOTATION MARK +结合重音)。

唯一合理的回答是您在错误的层次上思考:文本序列化是根据代码点定义的。字素簇仅用于处理自然语言和编辑文本。

这当然被认为是有效的 JSON。

>>> json.loads(bytes.fromhex('22cc8022'))
'̀'

关于c - 如何检查 UTF-8 字符串是否以 'a' 开头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44638508/

相关文章:

c - 为什么这个简单的C程序会挂起?

c - C 结构 malloc 代码中的 VC++ 2010 错误

c - Opencv C - 笛卡尔到极坐标图像转换

Python/Django 和阿拉伯文文档搜索应用程序

php - 如何删除网页脚本中的\ufeff 字符?

PHP:urlencode() 是允许 URL 中包含有效 UTF-8 字符串的安全方法吗?

javascript - 如何将 UTF8 字符串转换为字节数组?

c - 在 Linux 上获取文件选择器的简单方法

python - stderr 的 python 默认编码?

entity-framework - 带有 Entity Framework 的 Unicode