web-dev-qa-db-ja.com

OpenCSVを使用してUnicode文字を含むCSVファイルを解析します

NetBeans 6.0.1で OpenCSV を使用して.csvファイルを解析しようとしています。私のファイルにはUnicode文字が含まれています。出力に書き込むと、文字は(HJ1'-E /;)のような他の形式で表示されます。このファイルをメモ帳で開くと、問題ないように見えます。

私が使用したコード:

CSVReader reader=new CSVReader(new FileReader("d:\\a.csv"),',','\'',1);
    String[] line;
    while((line=reader.readNext())!=null){
        StringBuilder stb=new StringBuilder(400);
        for(int i=0;i<line.length;i++){
            stb.append(line[i]);
            stb.append(";");
        }
        System.out.println( stb);
    }
16
meysam_pro

まず、UTF-8やUTF-16など、ファイルがどのエンコーディングであるかを知る必要があります。そもそもこのファイルを生成しているのは何ですか?

その後は、比較的簡単です。FileInputStreamだけでなく、InputStreamReaderでラップされたFileReaderを作成する必要があります。 (FileReaderは常にシステムのデフォルトのエンコーディングを使用します。)InputStreamReaderを作成するときに使用するエンコーディングを指定します。適切なエンコーディングを選択すると、すべてが機能し始めます。

これを確認するためにOpenCSVを使用する必要はないことに注意してください。ファイルのテキストを自分で読んですべて印刷するだけで済みます。信頼できるかどうかわかりませんSystem.outただし、非ASCII文字を処理できるようにするために-文字の個々の値を整数(できれば16進数)として出力し、それらを チャートと比較するなど、文字列を調べる別の方法を見つけたい場合があります。 unicode.orgで 。一方、正しいエンコーディングを試して、何が始まるかを確認することもできます...

編集:わかりました。UTF-8を使用している場合:

CSVReader reader=new CSVReader(
    new InputStreamReader(new FileInputStream("d:\\a.csv"), "UTF-8"), 
    ',', '\'', 1);
String[] line;
while ((line = reader.readNext()) != null) {
    StringBuilder stb = new StringBuilder(400);
    for (int i = 0; i < line.length; i++) {
         stb.append(line[i]);
         stb.append(";");
    }
    System.out.println(stb);
}

(実際のコードでファイルを閉じるためのtry/finallyブロックがあることを願っています。)

37
Jon Skeet