回覆列表
  • 1 # 使用者3284374537321

    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不對其做識別而作為普通的字元處理,因此報錯。

    問題定位到該怎麼解決呢?

    解決方法:

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

    2.使用eclipse自建的檔案編碼,儘量不要從其他地方複製程式碼

  • 中秋節和大豐收的關聯?
  • 如果宇宙中一種經歷過億萬個宇宙毀滅的文明來到地球,它們會多強大?