5

まず第一に、私はあなたに感謝し、私がこの問題について数日間頭を悩ませ、他の同様のスレッドで解決策を探していて成功しなかったことを明確に言いたいと思います。

私たちのアプリケーションは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に移動すると、fileNameはUTF-8エンコーディングを使用して保存されず、ZoneRe?serve?e435.javaのようなファイル名になりました。

周りを見回すと、環境変数LC_CTYPEをUTF-8に設定する必要があることがわかりました。これでfileNameの問題は解決しましたが、それでもコンパイルエラーが発生します

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

それらは同じ名前ですが、2つの異なる方法でエンコードされているようです。興味深いのは、このエンコーディングの違いはJava 1.6で発生していましたが、正常にコンパイルされていたことです。

誰か提案やアイデアはありますか?

エンコーディングの問題を理解するようになったのは、クラスが次のように生成されるという事実に関連しています。

 Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), Charset.forName("UTF-8")));
  • ファイル内のコードは、U+00E9を使用して特別な文字を定義しています。
  • ファイル名はeU+0301を使用します。

これに対処する方法について何か提案はありますか?

4

1 に答える 1

2

あなたのファイルシステムは文字の分解された形式(文字とまたはとのéシーケンス)を使用しているようですが、コードジェネレーターは(である)の合成形式を使用しているようです。これは、分解された形式を常に使用する Apple の HFS+ ファイル システムの典型的な問題です。e´\u0065\u0301é\u00e9

この問題を解決するためにできることは、アプリケーションを変更して、生成されたソース ファイルに表示されるクラス名を次のように分解することですjava.text.Normalizer

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

参照: http://en.wikipedia.org/wiki/Unicode_equivalence

于 2012-11-28T20:33:41.520 に答える