【发布时间】: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