HFS +文件系统上Java类名称中的非ASCII字符

时间:2013-09-18 08:08:06

标签: java macos git jls hfs+

根据JLS,如果主机文件系统不支持Unicode,则可以“破坏”包含非ASCII字符的包名称。例如,当投影到文件系统时,包é变为@00e9papierMâ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个问题:

  1. 我无法用javac编译我的类,因为类名和文件名不一样(虽然我能够用 Maven编译它们 ecj )。
  2. 我无法通过 Git 管理我的课程,因为它总是报告该文件已被重命名:
  3. $ 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)
    

1 个答案:

答案 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访问它。