2013-01-05 4 views
7

日本語の文字を含むいくつかのディレクトリ/ファイルがあります。私がファイルを読み込もうとすると(例として)クを含むファイル名(内容ではなく)を読み込もうとすると、containingを含むStringを受け取る。私がファイル/ディレクトリを作成しようとすると、ファイル/ディレクトリに?を含むファイルが現れます。Javaの読み書きUnicode/UTF-8のファイル名(内容ではない)

例: 私はファイルを一覧表示します。

File file = new File("."); 
String[] filesAndDirs = file.list(); 

filesAndDirs配列には、この特殊文字を含むディレクトリが含まれるようになりました。文字列にはonlyだけが含まれます。これは、デコードするものは何もありません。なぜなら、getbytesは、異なる文字であっても、ファイル名の各文字に対して "-17 -65 -67"しか表示しないからです。

私はMacOS 10.8.2 Java 7_10とNetbeansを使用します。

アイデア?

は、事前にありがとう:)

+2

これらのファイル名をどのように表示しているのか、また、常にString.getBytes()のエンコーディングを提供しているかどうかはわかりません。実際に何が起こっているかを見るために、ファイル名の各文字のUTF-16コードポイントをダンプする必要があります。また、ファイルの作成時に入力データをどのように取得していたのかは不明です。 –

+0

'getBytes'は有効なUTF8と思われるものを返します –

+1

@Janはい、有効なUT8のようですが、getBytesはすべてのcharに対して" -17 -65 -67 "を返します。ただし、ファイル名とディレクトリ名の文字列がすべて同じであるとは限りません。 OSとJavaVMの間のすべての情報が失われているようです。特殊文字ごとに "-17 -65 -67"が繰り返されます。 [a-zA-Z ...]が期待通りに返されます。私は少なくとも、各charごとに異なるバイトを期待します。 –

答えて

2

をこれらのバイトは、あなたの代わりに日本語の文字を見ている\ ufffd文字のUTF-8でエンコードされた形である0xEFという0xbfのを0xbd、です。 Javaがどのファイルをリストするために使用しているOS機能が実際にそれらの間違った文字を戻しているかは明らかです。

おそらく、Files.newDirectoryStreamの方が信頼性が高くなります。これを代わりに試してみてください:

try (DirectoryStream<Path> dir = Files.newDirectoryStream(Paths.get("."))) { 
    for (Path child : dir) { 
     String filename = child.getFileName().toString(); 

     System.out.println("name=" + filename); 
     for (char c : filename.toCharArray()) { 
      System.out.printf("%04x ", (int) c); 
     } 
     System.out.println(); 
    } 
} 
+1

は魅力的に働いています:)今、私は、ファイルやフォルダを特別な文字で作成する方法を知る必要があります。どうもありがとうございました! –

+0

'Files'クラスのjavadocを見てください。それはそれらのすべてのことをする方法があります。 – VGR

2

これは古いjavaファイルapi(おそらくMac上)のバグです。とにかく、それはすべて新しいjava.nioで修正されています。

java.io.Fileおよび関連するクラスを使用してロードできなかったファイル名およびコンテンツに、ユニコード文字を含む複数のファイルがあります。使用するすべての私のコードを変換した後java.nio.Pathすべてが働き始めました。そして、私は同じ問題を抱えているorg.apache.commons.io.FileUtilsをjava.nio.Files ...

...に置き換え、適切な文字セットを使ってファイルの内容を読み書きしてください。 Files.readAllLines(myPath、StandardCharsets.UTF_8)

関連する問題