处理特殊字符时javac 1.6和javac 1.7之间的不同行为

MaL*_*nok 5 java encoding java-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">
Run Code Online (Sandbox Code Playgroud)

工作得很好.

当移动到java 1.7时,没有使用UTF-8编码保存fileName,导致文件名类似于:ZoneRe?serve?e435.java

环顾四周,我开始明白我需要将env变量LC_CTYPE设置为UTF-8.这解决了fileName问题,但我仍然遇到编译错误

error: class ZoneRéservée435 is public, should be declared in a file named ZoneRéservée435.java
Run Code Online (Sandbox Code Playgroud)

虽然它们具有相同的名称,但它们似乎以两种不同的方式编码.有趣的是,编码的这种差异发生在java 1.6中,但编译得很好.

有没有人有任何建议或想法?

根据我的理解,编码问题与使用以下内容生成类的事实有关:

 Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), Charset.forName("UTF-8")));
Run Code Online (Sandbox Code Playgroud)
  • 文件中的代码使用U + 00E9来定义特殊字符;
  • 文件名使用eU + 0301;

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

Ste*_*stl 2

看来您的文件系统使用字母的分解形式(即字符and或and\xc3\xa9的序列),而代码生成器使用(即)的组合形式。这是 Apple 的 HFS+ 文件系统上的一个典型问题,该系统始终使用分解形式。e\xc2\xb4\\u0065\\u0301\xc3\xa9\\u00e9

\n\n

要解决此问题,您可以做的是修改您的应用程序,以使用以下命令分解出现在生成的源文件中的类名java.text.Normalizer

\n\n

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

\n\n

另请参阅: http: //en.wikipedia.org/wiki/Unicode_equivalence

\n