当输入采用Unicode格式时,是否有标准/通用方法可以提供指向行和列的编译器样式错误消息?
例如,一种非常常见的编译器错误消息格式是: “filename:line_number:column_number:错误消息”,例如:
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等)时,在这种情况下(或应该)“列”的含义是什么?哪个字节?哪个代码点?哪个石墨烯?是否有任何工具可以选择一个或另一个先例?
答案 0 :(得分:2)
列应该引用非组合的Unicode代码点。 代理对(UTF-16)的两个部分都应该共享一列。 组合变音符号应该与它修改的基本字符共享一列。这也可能适用于其他非间距代码点。
答案 1 :(得分:1)
GNU编码标准表示应使用Unicode字符宽度来计算列号:http://www.gnu.org/prep/standards/standards.html#Errors。
这应该与消耗错误消息的Emacs如何计算列号兼容:https://www.gnu.org/software/emacs/manual/html_node/elisp/Columns.html。
GCC中似乎有一个错误:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=49973。
答案 2 :(得分:0)
对于"列"的问题没有通用的答案。值在编译器和类似工具的错误消息中解释。除了它是基于单一的,几乎所有的工具和编辑似乎都很荣幸之外,据我所知,没有为你提到的不同解决方案之一建立标准。据我所知,使用我的Ubuntu 14.04系统,甚至vanilla GCC和vanilla Emacs在处理制表符时都会有所不同:GCC似乎将一个制表符视为一个字符,而Emacs解释一个制表符,因为许多字符实际上是缩进的它
以下是我个人的建议。我很乐意得到反馈。对于正在编写输出此类错误消息的工具的任何人,我建议计算字节数,而不对标签,Unicode,代理项对或组合字符进行任何特殊处理。这是最有用的,因为用户几乎从不读取列号。相反,列号几乎总是由用户界面解析。这应该使输出消息的工具和显示消息的应用程序都更容易。我的提案结束了。
实际上,我会输出您正在使用的编程语言中更方便的内容。