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

标签 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">

工作正常。

当移动到 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)

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

关于java - 处理特殊字符时 javac 1.6 和 javac 1.7 之间的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13588940/

相关文章:

java - 从嵌套集合中检索值

java - BigDecimal 的总和列表

java - StandardOpenOption.SPARSE 有什么用?

Java zip 字符编码

java - 获取错误 : Comparison method violates its general contract

java - 无显示 - 使用 SimpleAdapter 的 ListView

java - 在带有 Java/JDBC 的 Oracle PL/SQL 中使用游标并获取结果

java - 如何在Struts 2中的xml配置的操作名称中使用通配符

html - mailto : link 中的英镑符号问题

c# - 如何获得正确的字符串文本?