使用Unicode报告编译器错误消息行/列号

使用Unicode报告编译器错误消息行/列号,unicode,compiler-errors,Unicode,Compiler Errors,当输入为Unicode格式时,是否有标准/通用的方法给出指向行和列的编译器样式错误消息 例如,一种非常常见的编译器错误消息格式是: “文件名:行\号:列\号:错误消息”,例如: (来自GCC):错误。c:1:10:语法错误,意外字符串 (来自自定义工具)input.dat:45:3:应为字符串_Literal,找到“;”, 当输入是固定的8位编码(如ISO-8859-1)时,这是明确的。但是,当输入是Unicode(UTF-8、UTF-16等)时,“列”在本例中是(或应该是)什么意思?哪个字

当输入为Unicode格式时,是否有标准/通用的方法给出指向行和列的编译器样式错误消息

例如,一种非常常见的编译器错误消息格式是: “文件名:行\号:列\号:错误消息”,例如:

  • (来自GCC):
    错误。c:1:10:语法错误,意外字符串
  • (来自自定义工具)
    input.dat:45:3:应为字符串_Literal,找到“;”,

当输入是固定的8位编码(如ISO-8859-1)时,这是明确的。但是,当输入是Unicode(UTF-8、UTF-16等)时,“列”在本例中是(或应该是)什么意思?哪个字节?哪个代码点?哪个是我?是否有任何工具为选择一个或另一个设置了先例?

列应指非组合Unicode代码点。代理项对的两个部分(在UTF-16中)应共享一列。组合变音符号应与其修改的基本字符共享一列。这可能也适用于其他非间隔代码点。

GNU编码标准规定,应使用Unicode字符宽度来计算列号:

这应该与使用错误消息的Emacs计算列号的方式兼容:


GCC中似乎有一个bug:。

对于编译器和类似工具的错误消息中如何解释“column”值的问题,没有通用的答案。就我所知,除了几乎所有的工具和编辑都尊重它是基于一个的这一事实之外,还没有针对您提到的不同解决方案之一建立标准。就我使用Ubuntu 14.04系统所见,即使是香草GCC和香草Emacs在处理制表符方面也会有分歧:GCC似乎将制表符视为一个字符,而Emacs则将制表符解释为实际缩进的字符数

下面是我个人的建议。我很想得到反馈。对于任何正在编写输出此类错误消息的工具的人,我建议对字节进行计数,不要对制表符、Unicode、代理项对或组合字符进行任何特殊处理。这是最有用的,因为用户几乎从不读取列号。相反,列号几乎总是由用户界面解析的。这将使输出消息的工具和显示消息的应用程序都更加容易。我的建议到此为止


实际上,我会输出您正在使用的编程语言中更方便的内容

我想我找到了我想要的和你的答案相符的东西。扩展的图形集簇,如中所定义。我可以通过ICU的BreakIterator得到这个。