【问题标题】:Character index in line with UTF-8 files符合 UTF-8 文件的字符索引
【发布时间】:2020-11-17 19:24:28
【问题描述】:

我正在为 UTF-8 文本编写一个词法分析器。当检测到错误时,我应该给出行号和行中的索引位置。

用户应该通过计算他在屏幕上(或纸上)看到的字符来识别行中的位置,直到他达到给定的索引值。他还可以使用某些编辑器显示的光标所在行中的索引。

我想我不能简单地使用符文计数作为索引,因为一些 unicode 字符的空格宽度为零,应该是隐藏标记或与非零空格宽度的 unicode 字符组合。

我该如何处理?

在给定包含符文的字节片的情况下,是否有一个函数能够提供可视 unicode 索引?

另外,文件中的行索引是从 0 开始还是从 1 开始?

【问题讨论】:

  • 我不知道有任何内置函数来获取“可见的 unicode 索引”,但通过记录你的符文数量来跟踪你自己应该相当容易'在当前行中遇到unicode.IsPrint 返回true
  • 可能类似于play.golang.org/p/KC0cD-S-_2n?我必须查找正确的字符范围集应该是什么。
  • 你确定编辑的假设吗? AFAIK 编译器将错误作为字节计数给出,而不是视觉计数(例如 TAB,vs SPACE)。编辑将管理它。我也不会假设等宽字符具有相同的宽度(或零),并且您可能有字素簇,您无法在它们之间移动。我会使用:unicode.org/reports/tr44/#General_Category_Values 并检查不同的类别 [M、C(但 TAB、新行和 Co、Cn)、Z,作为零宽度]。我会检查编辑器文档,了解他们如何计算空间。 East_Asian_Width 也可能有帮助
  • @GiacomoCatenazzi 如果我只需要提供字节计数值,那将极大地简化我的任务并解决我的问题。不幸的是,使用可视代码进行验证,底部栏中有一个 col 值,它将多字节 unicode 字母计为一个 col 单位。我需要检查聚合的 unicode 值。
  • @GiacomoCatenazzi 我尝试了组合字母 a̎。可视代码将其计为两列。所以视觉代码中的一列是一个未组合的 unicode 值。如果您对此提供答案,我会接受。

标签: go utf-8 unicode-string


【解决方案1】:

我在标准库中找不到任何东西,但这似乎可以做到:

package main
import "github.com/rivo/uniseg"

func index(s, substr string) int {
   g := uniseg.NewGraphemes(s)
   for n := 0; g.Next(); n++ {
      if g.Str() == substr { return n }
   }
   return -1
}

func main() {
   n := index("Z a̎ B", "B")
   println(n == 4)
}

https://pkg.go.dev/github.com/rivo/uniseg

【讨论】:

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