3

JLSによると、ホスト ファイルシステムが Unicode をサポートしていない場合、ASCII 以外の文字を含むパッケージ名を「マングル」することが可能です。たとえば、パッケージはにéなり、ファイル システムに投影されると になります。@00e9papierMâchépapierM@00e2ch@00e9

問題は、Java ソース ファイル (その名前は Java クラスの対応する名前に一致する必要があります) に対しても同じことを実現できるでしょうか?

'é'問題の背景は、パブリック クラス名 ( , )にアクセント付きの e と acute を付ける必要があることです'\u00e9'はい、すべきではないことはわかっています。ファイル名の Unicode は不正ですが、それでも必要です。

ただし、Mac OS X または基盤となる HFS+ ファイルシステムCOMBINING ACUTE ACCENTは、ファイル名にこの文字そのものを使用することはできず、'e' の直後に( )が続く文字に置き換えられます"e\u0301"。この動作は、NTFS や ext3/ext4 とはまったく異なります。この場合、名前が付けられた 2 つのファイル"\u00e9""e\u0301"同じディレクトリに共存できます (テスト リポジトリはここにあります)。

上記の HFS+ の動作により、次の 2 つの問題が発生します。

  1. javacクラス名とファイル名が同じではないため、クラスをコンパイルできません(ただし、 Mavenまたはecjでコンパイルできます)
  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 でファイルに名前を付けるという点で運が悪いです。

余談ですが、あなたはファイルを使用して git の問題を解決したと述べていますが、より良い方法は git で precomposeunicode オプション.gitignoreを有効にすることであることがわかるでしょう。

git config --global core.precomposeunicode true

papierMâché.javaこれを使用すると、ファイルを取得して、Linux、Mac、および Windows のすべてからアクセスできるはずです。

于 2013-10-23T14:48:10.197 に答える