根据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完全不同,其中名为"\u00e9"
和"e\u0301"
的两个文件可以共存于同一目录中(测试存储库为here)。
上述HFS +行为导致2个问题:
javac
编译我的类,因为类名和文件名不一样(虽然我我能够用 Maven编译它们或 ecj )。
$ 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)
答案 0 :(得分:2)
如果您希望您的名称是 ASCII安全,那么您可以将您的java文件命名为papierM@00e2ch@00e9.java
,并确保在任何其他类尝试引用它之前编译它。这将有效,因为<filename>.java
不需要<classname>.java
,但这是常见做法,编译器不会尝试从{{ClassA
编译ADifferentFilename.java
1}},原因很明显。但是,如果ADifferentFilename.java
已编译为ClassA.class
,那么它将有效。
除此之外,您在使用纯ASCII命名文件方面也不走运。
顺便说一句,你提到你已经使用.gitignore
文件解决了git问题,但是你可能会发现更好的方法是enable the precomposeunicode option in git。
git config --global core.precomposeunicode true
如果你使用它,那么你应该能够拥有你的文件papierMâché.java
并从所有Linux,Mac和Windows访问它。