1. 程式人生 > >【bug】Syntax error on token "Invalid Character", delete this token 的解決

【bug】Syntax error on token "Invalid Character", delete this token 的解決

原因 存在 普通 .net style line table 什麽 nta

原文地址:https://blog.csdn.net/actsai/article/details/24256987

eclipse 中遇到了Syntax error on token "Invalid Character", delete this token的錯誤提示,看代碼是完全沒有問題,上網查了半天發現遇到這個問題的好像不太多,總結一下問題原因和解決方案吧。

看到這個提示首先想到的是標點符號不是不是中文,或者全角半角的問題了,通過檢查,這種問題並不存在。

然後看到一個帖子說用Android Studio引入eclipse項目時遇到了同樣的錯誤,原因是eclipse和idea對同樣編碼utf-8的細節不一致,一個有BOM,一個沒有。

什麽是BOM呢?BOM的全稱是:Byte order mark。UTF-8以字節為編碼單元,沒有字節序的問題。UTF-16以兩個字節為編碼單元,在解釋一個UTF-16文本前,首先要弄清楚每個編碼單元的字節序。例如收到一個“奎”的Unicode編碼是594E,“乙”的Unicode編碼是4E59。如果我們收到UTF-16字節流“594E”,那麽這是“奎”還是“乙”?Unicode規範中推薦的標記字節順序的方法是BOM。BOM不是“Bill Of Material”的BOM表,而是Byte Order Mark。在UCS編碼中有一個叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的編碼是FEFF。而FFFE在UCS中是不存在的字符,所以不應該出現在實際傳輸中。UCS規範建議我們在傳輸字節流前,先傳輸字符"ZERO WIDTH NO-BREAK SPACE"。這樣如果接收者收到FEFF,就表明這個字節流是Big-Endian的;如果收到FFFE,就表明這個字節流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被稱作BOM。

UTF-8不需要BOM來表明字節順序,但可以用BOM來表明編碼方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8編碼是EF BB BF。所以如果接收者收到以EF BB BF開頭的字節流,就知道這是UTF-8編碼了。

通過UE查看文件的16進制形式,發現開頭包含EF BB BF串,eclipse不對其做識別而作為普通的字符處理,因此報錯。

把報錯文件使用notepad打開,右下方顯示文件編碼並不是單純的utf-8,

技術分享圖片

參考上文

解決辦法:

解決方法:

1.使用UE或者其他文本工具,將有問題的java文件另存為UTF-8,無BOM,替換原來的java文件。

2.使用eclipse自建的文件編碼,盡量不要從其他地方拷貝代碼

【bug】Syntax error on token "Invalid Character", delete this token 的解決