12

ファイルに対してさまざまな IO 操作を行うコードを扱っていますが、国際的なファイル名を扱えるようにしたいと考えています。Java 1.5 を搭載した Mac で作業していますが、ファイル名にサロゲートを必要とする Unicode 文字が含まれていると、JVM がファイルを見つけられないようです。たとえば、私のテストファイルは次のとおりです。

"草鷗外.gif"Java文字に分割されます\u8349\uD85B\uDFF6\u9DD7\u5916.gif

このファイル名からファイルを作成すると、FileNotFound 例外が発生するため、ファイルを開くことができません。ファイルを含むフォルダーでこれを使用しても失敗します。

File[] files = folder.listFiles(); 
for (File file : files) {
    if (!file.exists()) {
        System.out.println("Failed to find File"); //Fails on the surrogate filename
    }
}

私が実際に扱っているコードのほとんどは、次の形式です。

FileInputStream instream = new FileInputStream(new File("草鷗外.gif"));
// operations follow

ファイル名をエスケープするか、別の方法でファイルを開くなど、この問題に対処する方法はありますか?

4

4 に答える 4

7

JavaまたはMacのいずれかが適切なUTF-8の代わりにCESU-8を使用していると思われます。Javaは、さまざまな内部目的で「変更されたUTF-8」(CESU-8のわずかなバリエーション)を使用しますが、ファイルシステム/defaultCharsetとして使用できることを知りませんでした。残念ながら、ここでテストするMacもJavaもありません。

「変更済み」は、「ひどくバグがある」という言い方を変更したものです。

于 2009-10-09T20:31:24.747 に答える
5

環境のデフォルト ロケールにこれらの文字が含まれていない場合は、ファイルを開くことができません。

参照: File.exists() が名前に Unicode 文字で失敗する

編集: わかりました..必要なのは、システムロケールを変更することです。使用しているOSは何でも構いません。

編集

参照: Java でアクセントを含むファイルを開くにはどうすればよいですか?

参照: Mac の JFileChooser は、中国語の文字で名前が付けられたファイルを認識できませんか?

于 2009-10-09T19:35:00.913 に答える
3

これは Mac JVM の問題であることが判明しました (1.5 および 1.6 でテスト済み)。補助文字/サロゲート ペアを含むファイル名には、Java File クラスではアクセスできません。プロジェクトの Mac バージョン (ick) の Carbon 呼び出しを使用して、JNI ライブラリを作成することになりました。UTF-8 文字を取得するための JNI 呼び出しが CESU-8 文字列を返したため、ボビンスが言及した CESU-8 問題が疑われます。それはあなたが本当に回避できるもののようには見えません。

于 2009-11-25T21:05:17.420 に答える
0

これは古い学校の Java ファイル API のバグです。Mac だけでしょうか? とにかく、新しい java.nio api のほうがはるかにうまく機能します。java.io.File および関連クラスを使用してロードできなかった Unicode 文字とコンテンツを含むファイルがいくつかあります。java.nio.Pathを使用するようにすべてのコードを変換した後、すべてが機能し始めました。そして、org.apache.commons.io.FileUtils(同じ問題があります)をjava.nio.Filesに置き換えました...

...そして、適切な文字セットを使用してファイルの内容を読み書きしてください。たとえば、 Files.readAllLines(myPath, StandardCharsets.UTF_8)

于 2014-02-24T12:34:42.870 に答える