首先,我要感谢你,并明确地说,我已经在这个问题上苦苦思索了好几天,并在其他类似线程中寻找解决方案,但没有成功。
我们的应用程序负责生成 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;
关于如何处理这个问题有什么建议吗?
最佳答案
您的文件系统似乎使用了字母 é
的分解形式(这是字符 e
和 ´
的序列,或者\u0065
和 \u0301
),而您的代码生成器使用 é
的组合形式(即 \u00e9
) .这是 Apple 的 HFS+ 文件系统的一个典型问题,它始终使用分解形式。
解决这个问题的方法是修改您的应用程序,使用 java.text.Normalizer
分解出现在生成的源文件中的类名:
Normalizer.normalize(类名, Normalizer.Form.NFD)
关于java - 处理特殊字符时 javac 1.6 和 javac 1.7 之间的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13588940/