【问题标题】:How to navigate a UTF-8 text file如何导航 UTF-8 文本文件
【发布时间】:2013-06-17 16:26:53
【问题描述】:

我有一个 UTF-8 文本文件,我需要在 C 中导航。我需要将此文件拆分为单独的较小文件(即将它切成两半)。发生这种情况时,它有时会将多字节字符拆分为两个不同的文件。当一个笨拙的文本编辑器读取包含文本后半部分的文件时,它会读取剪切字符的后半部分并变得混乱,因此无法正确显示其余文本。如果我逐字节读取,我如何判断我是在字符的开头还是在中间?非 ascii 兼容的 UTF-8 字符都以设置为 1 的前导位开头,但有些是两个字节,有些是三个字节。

编辑:没关系,我刚刚发现第一个字节包含字符长的前导 1 的数量。 IE一个三字节字符是1110xxxx xxxxxxxx xxxxxxxx。

【问题讨论】:

  • 所以...前进直到你碰到一个前导字节?!
  • 在行终止符处拆分它是明智的,'\n'
  • 顺便说一句,仅在代码点边界处拆分也行不通。如果拆分发生在组合字符之间(例如,字母和变音符号,或者在韩文序列的中间,您也会遇到渲染问题。
  • @rici:是的,但它仍然会产生有效的 UTF-8 文件,尽管很笨重。
  • @R..:有效,是的。但它们可能无法正确显示,这是我理解的问题的一部分。也许“行不通”太极端了。

标签: c parsing utf-8


【解决方案1】:
if ((*s & 0xc0) == 0x80) /* You are in the middle of */;

【讨论】:

    【解决方案2】:

    所有 UTF-8 字符均由前导字节和零个或多个连续字节组成。所有连续字节都是二进制形式的“10xxxxxx”。所以所有前导字节都是以下两种形式之一:“0xxxxxxx”或“11xxxxxx”。

    【讨论】:

      【解决方案3】:

      UTF-8 字符使用 1 到 4 个字节表示。

      检查一个字节,如果你有这个二进制模式:

      10xxxxxx
      

      你在一个多字节的中间。你应该继续下一个主角。

      如果你有这个:

      0xxxxxxx
      

      你有一个 1 字节的字符。

       110xxxxx
      

      是 2 字节字符的前导字节

       1110xxxx
      

      是一个 3 字节字符的前导字节

       11110xxx
      

      是 4 字节字符的前导字节

      【讨论】:

        猜你喜欢
        • 2021-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多