2012-03-16 142 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,代理對或組合字符進行任何特殊處理。這是最有用的,因爲用戶幾乎從不讀取列號。相反,列號幾乎總是由用戶界面進行分析。這應該使輸出消息的工具以及顯示消息的應用程序變得更容易。我的提議結束。

務實地,我會輸出任何更方便的編程語言,您正在使用。