Scintilla:如何在给定特定字符位置的情况下找到字节位置

Posted

技术标签:

【中文标题】Scintilla:如何在给定特定字符位置的情况下找到字节位置【英文标题】:Scintilla: How do you find the byte position given a specific character position 【发布时间】:2010-12-20 17:30:12 【问题描述】:

给定一行上的特定字符索引,例如第 3 行的第 10 个字符,有没有一种简单的方法可以计算 Scintilla 对该字符的“位置”?

使用 ASCII 字符时这很简单,但在使用多字节 UTF-8 字符时我看不到一个简单的方法,其中单个字符可能占据多个字节位置。

【问题讨论】:

【参考方案1】:

将行文本转换为 UTF8,然后计算字节位置。如果可以进行多个请求,则缓存转换。

【讨论】:

【参考方案2】:

您应该从字符串的开头开始并索引到字符串,但是有多少字节对应于当前位置的字符(以便您现在索引下一个字符),并记录您有多少个字符到目前为止看到。这种线性时间索引是 UTF-8 的缺点之一。也许 Scintilla 已经有能力做到这一点。

【讨论】:

我希望有一个 Scintilla 特定的 API 可以完成我刚刚错过的工作。【参考方案3】:

你试过了吗:SCI_FINDCOLUMN ?:SCI_FINDCOLUMN(int line, int column) 此消息返回考虑到制表符宽度的行上列的位置。它将多字节字符视为单个列。列号,如行从 0 开始。

【讨论】:

好主意,但如果文本中包含制表符字符,则不会导致问题并夸大实际位置数。即我可以在样式时使用该列号准确指向文本吗? 我认为您可以在设置文本样式时使用 SCI_FINDCOLUMN,但您可以进行测试,看看是否有效。

以上是关于Scintilla:如何在给定特定字符位置的情况下找到字节位置的主要内容,如果未能解决你的问题,请参考以下文章

JSK-27321 统计单词数字符串

P1308(字符串类,处理字符串查找)

如何使用 Scintilla 处理 Unicode 字符串

洛谷 P1308 统计单词数字符串+模拟

添加一行文本

如何在给定位置数组的情况下移动标记?