3

根据JLS,如果主机文件系统不支持 Unicode,则可以“修改”包含非 ASCII 字符的包名称。例如,包é变为@00e9,并且在投影到文件系统时papierMâché变为。papierM@00e2ch@00e9

问题是:对于 Java 源文件(其名称必须与 Java 类的相应名称一致)是否有可能实现相同的目标?

问题的背景是我需要在我的公共类名('é''\u00e9')中有一个带有尖锐的重音 e。是的,我知道我不应该,文件名中的 Unicode 是一种弊端,但我仍然需要它。

但是,无论是 Mac OS X 还是底层 HFS+ 文件系统都不允许在文件名中使用这个字符,而是将其替换为 'e' 后跟COMBINING ACUTE ACCENT( "e\u0301")。这种行为与 NTFS 或 ext3/ext4 完全不同,在 NTFS 或 ext3/ext4 中,两个文件命名"\u00e9""e\u0301"可以共存于同一目录中(测试存储库在此处)。

上述 HFS+ 行为导致 2 个问题:

  1. 我无法编译我的类,javac因为类名和文件名不一样(尽管我可以使用Mavenecj编译它们)。
  2. 我不能用Git管理我的课程,因为它总是报告文件已被重命名:

.

$ git status .
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   "src/main/java/com/intersystems/persistence/Cache\314\201ExtremeConnectionParameters.java"
#   "src/main/java/com/intersystems/persistence/Cache\314\201ExtremePersister.java"
#   "src/main/java/com/intersystems/persistence/Cache\314\201JdbcConnectionParameters.java"
#   "src/main/java/com/intersystems/persistence/Cache\314\201JdbcPersister.java"
#   "src/main/java/com/intersystems/persistence/ui/Cache\314\201JdbcConnectionParametersPanel.java"
nothing added to commit but untracked files present (use "git add" to track)
4

1 回答 1

2

如果您希望您的名称是ASCII 安全的,那么您可以将您的 java 文件命名为papierM@00e2ch@00e9.java,并确保在任何其他类尝试引用它之前对其进行编译。这将起作用,因为不需要<filename>.java是,但是这是常见的做法,编译器不会尝试从 编译,原因很明显。但是,如果已经编译为,那么它将起作用。<classname>.javaClassAADifferentFilename.javaADifferentFilename.javaClassA.class

除此之外,您在以纯 ASCII 命名文件方面并不走运。

顺便说一句,您提到您已经通过使用.gitignore文件解决了 git 问题,但是您可能会发现更好的方法是在 git 中启用 precomposeunicode 选项

git config --global core.precomposeunicode true

如果你使用它,那么你应该能够拥有你的文件papierMâché.java并从所有 Linux、Mac 和 Windows 访问它。

于 2013-10-23T14:48:10.197 回答