go - 符合UTF-8文件的字符索引

标签 go utf-8 unicode-string

我正在为UTF-8文本编写词法分析器。当检测到错误时,我应该给出行号和行中的索引位置。
希望用户通过计数他在屏幕(或纸面上)上看到的字符来确定行中的位置,直到达到给定的索引值为止。他还可以使用某些编辑器显示的光标所在行的索引。
我想我不能简单地使用 rune 数作为索引,因为某些Unicode字符的空格宽度为零,并且应该是隐藏标记或与非零空格宽度的Unicode字符组合。
我应该如何处理呢?
给定包含 rune 的 byte slice 时,是否存在能够赋予视觉unicode索引的功能?
另外,文件中的行索引是从0还是从1开始?

最佳答案

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

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

func Index(s, substr string) int {
   o := uniseg.NewGraphemes(s)
   for n := 0; o.Next(); n++ {
      if o.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

关于go - 符合UTF-8文件的字符索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64881952/

相关文章:

c++builder - XE6 如何检查 UnicodeString 是否为 null?

go - Gob在流处理中的使用示例

php - 读取特定地址的内容网页

sql-server - SQL Server 无法从 XML 字符串解析 CDATA

c++ - 如何将 wchar_t 值打印到控制台?

r - 将\u 转义的 Unicode 字符串转换为 ASCII

dictionary - 如何扩充 ResponseWriter 的 Header() 返回的映射

docker - 无法使用 Goland 部署 docker 容器 - DockerClientException - .eslintrc(没有这样的文件或目录)

mongodb - 用MongoDB官方Golang驱动可以查到一条记录,但是记录是空的

java - 使用 Java 将 MySql 字符串 ISO-8859-1 转换为 UTF-8