2012-11-27 29 views
5

首先我要感謝你,並明確地說我已經在這個問題上抨擊了好幾天,並尋找其他類似的解決方案線程沒有成功。javac 1.6和javac 1.7在處理特殊字符時的不同行爲

我們的應用程序負責生成java類,其中一些可能包含特殊字符(如文件名),例如ZoneRéservée435.java,強制編碼爲UTF-8。

直到Java 1.6的Ant任務:

<javac source="1.5" target="1.5" srcdir="${src.dir}" destdir="${classes.dir}" deprecation="on" debug="on" classpathref="classpath" fork="false" memoryMaximumSize="512m" encoding="UTF-8"> 

工作的罰款。

當移動到Java 1.7的文件名沒有使用導致類似的文件名的UTF-8編碼保存得到?ZoneRe服務e435.java

環顧四周我才明白,我需要?將env變量LC_CTYPE設置爲UTF-8。 這解決了名的問題,但我仍然得到一個編譯錯誤

error: class ZoneRéservée435 is public, should be declared in a file named ZoneRéservée435.java 

雖然他們有相同的名字,他們似乎在兩種不同的方式進行編碼。 有趣的部分是,這種編碼的差異是發生在Java 1.6,但編譯好。

有沒有人有任何建議或想法?

對於我才明白編碼問題涉及到這個類有以下產生的事實:

Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), Charset.forName("UTF-8"))); 
  • 文件中的代碼是使用U + 00E9定義特殊燒焦;
  • 文件名稱使用eU + 0301;

有關如何處理此問題的任何建議?

+0

我也要喜歡添加這樣一個事實,即我已將file.encoding和sun.jnu.encoding全部設置爲UTF-8 – MaLLinok

+0

您的舊名稱文件是否也存在?如果是,那會導致問題。刪除那個。 –

+0

Hum沒有包含生成源的目錄每次都會被刪除並生成。編譯代碼 – MaLLinok

回答

2

看來你的文件系統使用字母é的分解形式(這是字符e´\u0065\u0301的順序),而你的代碼生成器使用的é的組成形式(這是\u00e9)。這是Apple的HFS +文件系統中的一個典型問題,它始終使用分解形式。

,你能做些什麼來解決這個問題是修改應用程序分解出現的生成源文件與java.text.Normalizer類名:

Normalizer.normalize(classname, Normalizer.Form.NFD)

參見:http://en.wikipedia.org/wiki/Unicode_equivalence

+0

謝謝Stefan,那就是訣竅! – MaLLinok