2012-03-16 80 views
2

当输入采用Unicode格式时,是否有标准/常用的方式来提供指向行和列的编译器式错误消息?使用Unicode编译器错误消息行/列号编号

例如,一种非常常见的编译器错误信息格式是: “文件名:LINE_NUMBER:COLUMN_NUMBER栏:错误消息”,例如:

  • (来自GCC):bad.c:1:10: syntax error, unexpected STRING
  • (从定制工具)input.dat:45:3: expected String_Literal, found ';'

当输入是固定的8位编码,如ISO-8859-1时,这是明确的。但是当输入是Unicode(UTF-8,UTF-16等)时,在这种情况下(或应该)“列”是什么意思?哪个字节?哪个代码点?哪个字素?有没有什么工具可以选择其中的一种呢?

回答

2

A 应该指代非组合的Unicode代码点。代理对(UTF-16中)的的两部分应共享一列。结合变音标记应与它修改的基本字符共享一列。这也可能适用于其他非空格代码点。

+1

我想我找到了我想要的与您的答案相匹配的东西。扩展字形集群,如http://unicode.org/reports/tr29/中所定义。我可以通过ICU的BreakIterator获得此信息。 – wjl 2012-03-19 15:54:52

0

对于如何在编译器和类似工具的错误消息中解释“列”值的问题,没有普遍的答案。据我所知,除了几乎所有工具和编辑似乎都尊重的基于一个事实的事实之外,没有关于您提到的不同解决方案之一的标准。就我所见,使用我的Ubuntu 14.04系统,即使是GCC和vanilla Emacs在处理制表符时也不同意:GCC似乎将一个制表符计为一个字符,而Emacs将制表符解释为许多字符实际上被缩进它。

以下是我个人的建议。我很想获得关于它的反馈。对于任何正在编写输出此类错误消息的工具的人,我都会建议对这些字节进行计数,而不是对选项卡,Unicode,代理对或组合字符进行任何特殊处理。这是最有用的,因为用户几乎从不读取列号。相反,列号几乎总是由用户界面进行分析。这应该使输出消息的工具以及显示消息的应用程序变得更容易。我的提议结束。

务实地,我会输出任何更方便的编程语言,您正在使用。