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 时,文件名未使用 UTF-8 编码保存,导致文件名类似于:ZoneRe?serve?e435.java

环顾四周,我了解到我需要将环境变量 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;

关于如何处理这个问题的任何建议?

4

1 回答 1

2

似乎您的文件系统使用了字母的分解形式é(即字符e´\u0065与的序列\u0301),而您的代码生成器使用了é(即\u00e9)的组合形式。这是 Apple 的 HFS+ 文件系统上的一个典型问题,它总是使用分解的形式。

你可以做些什么来解决这个问题是修改你的应用程序来分解出现在生成的源文件中的类名java.text.Normalizer

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

另见:http ://en.wikipedia.org/wiki/Unicode_equivalence

于 2012-11-28T20:33:41.520 回答