【问题标题】:What is the fastest way to skip unicode characters跳过Unicode字符的最快方法是什么
【发布时间】:2011-09-28 17:39:42
【问题描述】:

我正在尝试获取 UTF-16 格式文件中的某些字符。

我知道我想跳过多少个字符。我目前正在使用TextReader.ReadBlock 命令读取我想跳过的所有字符的临时数组,但我相信设置位置会更快。我只是不知道如何确定新的位置。

如果您想跳过多少个字符,您知道跳到 unicode 文件中某个位置的最快方法是什么吗?

【问题讨论】:

  • 您的文件和跳过块有多大?
  • 他们已经达到了 100 兆字节
  • 免去了 utf-16 编码的烦恼,如果不实际读取文件,您无法知道要跳过多少 cr/lf 行结束字符。

标签: c# unicode file-io


【解决方案1】:

跳过一个块并不容易,这需要相对定位。

如果你可以计算下一个块的开始(从文件开始的偏移量)是可行的:

        int nextPos = ...;

        reader.DiscardBufferedData();
        reader.BaseStream.Position = nextPos;
        line = reader.ReadLine();

您可能需要调整您的计算,因为 UTF-16 文件可以有一个 BOM(2 个前导字节)。

【讨论】:

    【解决方案2】:

    考虑到这个操作系统是 UTF-16 而不是 UTF-8(字符大小可以变化),每个字符有 2 个字节。所以要跳过 x 个字符,你必须跳过 x*2 个字节。

    【讨论】:

    • UTF-16 也可以包含伪对(4 字节/字符)。非常不可能,但仍然。而且您必须同步 TexReader 和 Stream,这很棘手。
    • 只有当你忽略组合字符、代理等时才会这样。
    • @Henk:据我所知,代理项在 .NET 中被分成 2 个字符,每个 2 个字节。所以他们应该“符合”一般规则。
    • 似乎对我不起作用。它适用于文件的开头,但很快就停止了。
    猜你喜欢
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 2014-03-19
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    相关资源
    最近更新 更多