Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

BufferedReaderによる文字化け

はじめまして。
JLと申します。

webページからアップロードされたファイルをservletで受け取り、BufferedReaderのreadLineメソッドを使用して読み込もうとしているのですが、日本語の文字化けを治すことができません。

ファイルはExcelから出力されたタブ区切りのCSVファイルで、アップロードライブラリはhellohiroさんのものを使用しています。

どなたかご教授よろしくお願いします。


--------------------------------------------------

public void doPost(HttpServletRequest request, HttpServletResponse response) {

        String path = getServletContext().getRealPath("tmp");
        FileUploadRequest up = null;
        BufferedReader reader = null;

        try {

            up = new FileUploadRequest(request, path);

            reader = new BufferedReader(new InputStreamReader(
                    new FileInputStream(up.getFile("file"))));

            while (reader.ready()) {

                System.out.println(reader.readLine());
            }

        } catch (Exception er) {

            er.printStackTrace();
        } finally{
            try {
                reader.close();
            } catch (IOException e) {
                
                e.printStackTrace();
            }
        }

20

回答

11120

閲覧

20件の回答

評価

0

提案。

InputStreamReaderのコンストラクタには、
文字コードが渡せます。

評価

0

コロさん早速の回答ありがとうございます。

書き忘れました

文字コードも一通り試してみました。

MS932
Windows-31J
Shift_JIS

cp932は未サポートのようです。

それとあらゆる手として
FileReaderも使ってみたのですが失敗に終わってしまいました、

ほかにありましたらよろしくお願いします。

評価

0

>文字コードも一通り試してみました。

UNIX用コードがないのはともかく、Unicodeもねえのな。

評価

0

Excelファイルですので・・・
一応試したのですがだめでした。

回答ありがとうございます。

評価

0

http://msugai.fc2web.com/java/IO/charset.html

このへんを全部試してみるとか…。

あと、どの時点で化けちゃってるか調査するといいかも。

評価

0

Linuxならutf-8だよ。

評価

0

コロさん$さんありがとうございす。

コロさんに頂いたURLで一通り試してみます。

またご報告します。

評価

0

と思ったけど、ファイルアップロードだと中身はそのままファイルに落ちるよな…。
Excelの出力はShift_JISだからShift_JISで読めそうなもんだが…。

評価

0

本当にバイナリじゃないんだろうな、
と疑ってみるのも一手かも。

評価

0

どうでもいいとこだが、

>タブ区切りのCSVファイル

それはTSV。


不良社員さんが書いてるとおり、実は.txtという拡張子の.xlsだったらアレだなあ。
アップロードする前のものをメモ帳で読み込みさえすれば分かること。

評価

0

コロさんに教えていただいたページの文字コードは一通り試したのですがやはりだめでした。

そもそもここで言っているExcelファイルはとあるシステムから出力されたもので実際どのような経緯で出力されているのか調べてもわかりませんでした。

ただメモ帳で普通に開けるのでバイナリではないようです。

文字化けはreadLineメソッドで読んだところで文字化けを起こしていて、InputStreamReaderでの文字コードを指定する際、どれを指定しても(utf-8含)同じ文字化けになる所が気になっているところです。

送信元のWebページをutf-8にしているのですが、それがファイルに影響することはあるのでしょうか?

質問内容には書いていませんが、requestの文字コードはutf-8にしています。

可能性としてライブラリに原因があるとも考えられそうなので、jakartaのライブラリでも試してみようと思います。

後ほど、またご報告します。

-------------------------------------
タブ区切りcsvはtsvっていうんですね。
$さんありがとうございます。
一時の恥ですみましたm(-_-)m

評価

0

蛇足
csv は Comma Separated Values
tsv は Tab Separated Values

コレで覚えておくと、
cvsとcsvがごっちゃにならなくていいかも(あんま役に立たないかも)

評価

0

>メモ帳で普通に開ける
というのは、もちろん中身の確認までできるってことだよね。

ファイルアップロードは中身がテキストかバイナリかを区別なんかしない。
文字コードというものがテキストに付随する概念である以上、関係ないということになる。

ただし、それがServlet-API内やライブラリで変換されてしまうという可能性は、否定できない。

>どれを指定しても(utf-8含)同じ文字化けになる
例えばFileを/var/tmpへコピーするだけのコードを書いて、viなりでファイルの中身を確かめてみる。

そのライブラリは使ったことがないから評価はできないが、比較や検証は必要だろう。

評価

0

みなさん大変申し訳ありません。

ものすごく初歩的過ぎのミスで言うのも恥ずかしい次第です。こんなことで今日で4日目、うち2日も皆さんに付き合わせてしまってほんと申し訳ないです。

真剣に考えていただいて感謝しております。

実はInputStreamのコンストラクタではなくFileのコンストラクタの引数に文字コードの指定を入れておりました。

どおりで文字化けした文字が変わらないはずです。

いやあ、ただただ謝ります。m(--)m
ほんと申し訳ないです。

以後気をつけます。

また顔出しますので今後ともよろしくどうぞm(--)m

評価

0

そういうこともあるのね。
他山の石とさせていただきます。
お疲れ様でした。

評価

0

>Fileのコンストラクタの引数に文字コードの指定
最初のコードのどこにFileのコンストラクタが?

ところで、2008-10-22 09:24のコメントは理解した?
そもそも「タブ区切りのCSVファイル」なんてもの自体が存在しないってことなんだけど。

評価

0

$さん
返答遅くなって申し訳ありません。

早速、e-wordsで調べさせていただきました。
周りの人たちとの間でcsvで通っていたのでそうゆうものだと思い込んでおりました。
(私だけ本当の意味を知らなかった可能性大ですが・・・)

そしてご指摘の・・・
FileクラスではなくFileInputStreamの間違いでした。
ということでテスト用サーブレットで無事成功しました。

というのもつかの間でいざ目的のサーブレットで試したところ、また同じ現象で引っかかってしまい、振り出しに戻ってしまいました。

ライブラリもjakartaのものに変えてもやはりだめでした。

なにかクラスの作り方が悪いのかもしれません。
あまり時間もないので早めに解決したいと思っていますので、もう少しこのスレお付き合いいただけますでしょうか。

本番ではファイルから1行読み込んだら正規表現を使い文字列の探索を行おうとしています。

現状で分かったことは、
Patternクラスで正規表現文字列をコンパイルする前にreadLine()すると、文字化けをしないということでした。

例えば、コンストラクタなどで
[先にコンパイルしておく]
ということはできないのでしょうか?


そうでないとループ内で比較のつどコンパイルすことになってしまいますよね?

よろしくどうぞ。

評価

0

ごめんなさい何を言っているのか全然理解できなかった。
>ファイルから1行読み込んだら正規表現を使い文字列の探索

>Patternクラスで正規表現文字列をコンパイルする前にreadLine()すると、文字化けをしない

…え?
ファイルから読み込んだ文字列をAとしましょ。
その中から正規表現に合うものをさがすの?

ちょっと、意味がわからないので、最小のコードを書いてはいただけないでしょうか。

評価

0

>FileクラスではなくFileInputStreamの間違いでした。
ますます分からん…。
FileInputStreamのコンストラクタに、引数を2つ取るものなんてないんだが…。

>ライブラリもjakartaのものに変えてもやはりだめでした。
やはりどこか作りがおかしいんだろう。
アップロードされたファイル自体は確認したのか?

>早めに解決したいと思っています
付き合うのは構わないが、早めに解決したいのはそっちの都合であって回答する側には関係のない話。


>Patternクラスで正規表現文字列をコンパイルする前にreadLine()すると、文字化けをしない
そういうことをいきなり書いても、読んでる側には分からないよ。
どんな正規表現をどう使ってるか、読んでる人間はどこで確認すればいい?
その「目的のサーブレット」とやらを見ることができるのは、自分だけなんだからね。

「急がば回れ」という古い言葉を書いておこう。

評価

0

あと、これが仕事なら、自分の都合で肝心の部分を赤の他人にやってもらってるってことになるんだよ。
本来ならカネを払ってやってもらうことだ。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。