有没有办法根据字符而不是字节来进行搜索或告诉?

问题描述 投票:0回答:1

根据 Tcl/TL 通道手册页

chan read
读取字符而不是字节;但是,如果通道配置为二进制,它将读取字节。也就是说,
chan read numChars
将读取
numChars
字节。

chan seek
chan tell
均指字节。对于这两个命令,是否存在与从字符到字节的
chan read
更改相同的功能,以便它们引用通道中的字符位置而不是字节?

上下文是这样的。我必须以二进制形式写入通道,并且数据包含多字节字符。有一组指针,用于跟踪写入通道的所有文本段的起始字节和字符长度。可以代替或附加地跟踪字节长度。稍后从通道读取完全相同的片段没有问题。问题是指针经常需要快速地分割成两部分——前端和后端——并且只知道分割的字符位置。

例如,我会知道指针开始一个字节

b
,字符长度为50,在较大的字符串中字符位置为484。我还知道从第 500 个字符开始,将删除 20 个字符。这意味着现在需要两个指针,一个从字符 484 到 499,另一个从 520 到 533。前指针将具有起始字节
b
和字符长度
500-484
。结束指针的字符长度为
534-520
;但我看不出有什么办法知道起始字节;因为它取决于它前面的字节数,并且如果不首先读取字节就无法得知。这只能通过数学来完成,没有时间检索文本并计算它。

所以,我需要一种基于角色的分割方式。起始字节和字符长度适合后面读取数据;但是在这些读取之间分割片段让我感到困惑。

我应该补充一点,我认为我可以跟踪字符中的所有内容,并将二进制数据作为字符串读取。但这需要立即读取所有数据,然后将字符串分割成段,然后连接。我认为通过寻找正确的起始位置并阅读这么多字符可能会更容易阅读这些片段。但是,也许所有这些查找也需要大量工作,这样将所有数据(包括不需要的段)读入内存会更有效。

感谢您提供的任何指导。

tcl channel
1个回答
0
投票

用于查找/文件定位的操作系统 API 与字节一起工作,而且一直如此; Tcl 的 API 非常直接地反映了这一点。如何计算 UTF-8 等可变宽度编码中第 n 个字符的实际字节索引?它将位于 n4×n 之间的任意字节索引(概率分布朝向范围的下端,具体取决于所使用的语言)。

计算索引的唯一已知可靠方法是从文件中读取字符,直到达到所需的字符数,然后查看位置是什么(使用

chan tell
)。尽管在幕后进行了缓冲,但 Tcl 仍会在每个字符的位置上进行跟踪。然后您可以随时
chan seek
返回到它(前提是文件的该部分没有被重写)。

如果您知道文件是用恒定宽度编码(或只是二进制)写入的,那么计算位置很容易,但知道何时为真取决于脚本级别。这种理解水平是 Tcl 的渠道系统所不具备的,而且实际上也永远不会获得。

© www.soinside.com 2019 - 2024. All rights reserved.