2011-08-09 5 views
0

ファイルからUTF-8文字をバイトとして読み取ることができません。 バイトから文字に変換する際に、UTF-8文字がquestionmarak(?)として表示されています。ファイルからUTF-8文字をバイトとして読み取る方法は?

以下のコードスニペットは、ファイルの読み取りを示しています。

ファイルからUTF-8チャンネルをどのように読み取ることができるか教えてください。 とplzバイト配列の読み取りプロセスの問題は何ですか?

public static void getData { 

    FormFile file = actionForm.getFile("UTF-8"); 

    byte[] mybt; 
    try 
    { 

       byte[] fileContents = file.getFileData(); 
     StringBuffer sb = new StringBuffer(); 
     for(int i=0;i<fileContents.length;i++){ 
      sb.append((char)fileContents[i]); 
     } 
     System.out.println(sb.toString()); 
    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } 
    } 

Output ::??Docum??ents (input file content is : "ÞDocumÿents" , it contains some spanish characters.) 

答えて

3

これは問題です:

for(int i=0;i<fileContents.length;i++){ 
    sb.append((char)fileContents[i]); 
} 

あなたはそれをキャストすることによってchar型に各バイトを変換しています。それは効果的にISO-Latin-1を使用しています。

InputStreamから読み取るには、文字エンコードを指定してInputStreamReaderに変更します。

文字列にファイル全体を読み込む最も簡単な方法は、Guavaを使用することです:

String text = Files.toString(file, Charsets.UTF_8); 

またはバイト配列に変換する:

String text = new String(fileContents, "UTF-8"); 
+0

キャストが実際に変換されないだろうUTF-16コードユニットへのchar? –

+0

@Vineet:いいえ、 'char' *は* UTF-16コード単位です。そのバイトの値を取ってUTF-16コード単位として解釈するだけで、*バイトから変換します。これは基本的にISO-8859-1の機能です。バイト0-255をU + 0000にU + 00FFにマップします。 –

+0

ああ、あなたは正しい。私はStringBufferとバイト配列の間で混乱しています。 –

関連する問題