我正在编写一个解析 UTF-8 字符串的解析器。ASCII 范围之外的字符只能出现在以'或开头和结尾的字符串文字内部"。该语言的其余部分可能只包含 ASCII 字符,因此如果我发现超出 ASCII 范围的字节,我可以简单地返回错误。
我似乎无法弄清楚的问题是,当我在字符串文字中遇到非 ASCII 字符时,如何检测该字符要跳过多少字节?我担心的是,如果多字节字符包含'or"作为字节之一,我的解析器将提前结束字符串文字。
0x80也许问这个问题的更简短的方法是,如果我遇到-范围内的字节0xFF,我如何检测 UTF-8 编码字符串中该字符有多少字节?
我正在用 C 语言编写这个解析器,但我怀疑这并不重要。
\n\n我担心的是,如果多字节字符包含 ' 或 " 作为字节之一,我的解析器将提前结束字符串文字。
\n
啊,这是你的误会。UTF-8 的高明之处在于这种情况不会发生。在 UTF-8 中,字节 0x27 只能表示撇号。它永远不能是多字节序列的一部分。这是因为连续字节以设置为 1 的高位开始。
\nUTF-8 的一个主要设计目标是现有的和 na\xc3\xafve ASCII 实现在解析 UTF-8 流时将以相同的方式工作,即使流包含非 ASCII 字节也是如此。您可以安全地解析"并继续累积字节,直到到达"(并使用\\转义内部"),并且永远不必担心是否存在 UTF-8 涉及的多字节字符。ASCII 解析器不需要理解 UTF-8 或执行任何 UTF-8 解码即可正常工作。
除此之外,如果您决定确实想知道问题的答案,第一个字节的前导 1 位的数量会告诉您长度,但零个 1 是“1 个字节”,一个 1 是“连续”。
\n0x00 - 0x7F -> 1 byte\n0x80 - 0xBF -> (continuation)\n0xC0 - 0xDF -> 2 bytes\n0xE0 - 0xEF -> 3 bytes\n0xF0 - 0xF7 -> 4 bytes\nRun Code Online (Sandbox Code Playgroud)\n您也可以继续扫描,直到找到 0x00-0x7F 范围内的内容。
\n| 归档时间: |
|
| 查看次数: |
196 次 |
| 最近记录: |