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

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

0

InputStreamReaderの文字コードとURLエンコードによる変換に関して

(匿名での投稿ですのでこう書くのは一般的ではないですが)初めまして。

InputStreamReaderで文字コードを指定して読み込みを行い、それをURLエン
コードを通して表示させようとしたところ、文字化けが発生し、意図した動
作をさせることができませんでした。
意図した動作は、日本語(ほげほげ等)を入力し、入力した文字列と同じ文字
列が表示されるという動作です。

以下に、使用したコードを簡潔にまとめたコードを記述します。


--------------------------------------------------
import java.io.*;
import java.net.*;

public class Main{
  public static void main(String[] args) throws IOException{
    String str;
    BufferedReader r = new BufferedReader(new 
InputStreamReader(System.in,"UTF8"));
    str = r.readLine();
    
System.out.println(URLDecoder.decode(URLEncoder.encode(str,"UTF8"),"
UTF8"));
    }
}

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

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

5

回答

84920

閲覧

5件の回答

評価

0

で、自分ではどこまで調べてみたの。

評価

0

InputStreamReaderについて、
SJIS, JIS, MS932, iso-8859-1, EUCJP, UTF8, Unicode, 指定なし は調べま
したが、
UnicodeはそもそもreadLineで改行を読み取ってくれないのか、上手く読み取
らせることができません。

URLエンコード部分は、上で述べた文字コードで、指定なし以外のものについ
て、エンコードとデコードを同じ文字コードとして、上記の文字コードとの間
で考えられる組み合わせを全て調べました。

評価

0

二つのことを一度に試すと、どこが問題か探すのに苦労します。
まずは URLDecoder/URLEncoder は後回しにして入出力の文字コード。

コンソール入出力の場合 System.out での文字コード変換をそのままで System.in だけいじったら
化けて当然です。文字コード無指定の InputStreamReader を使えば多くの場合は何も指定しなくても
 OS や JVM が手頃な文字変換に設定してくれますが Mac やリモート接続のコンソール等一部
うまく行かない場合があります。

そんなときは java コマンドの -Dfile.encoding="文字コード" で端末プログラムとあわせて下さい。
まずは System.out.println("こんにちは")); で「こんにちは」が表示出来るか確認。駄目なら
-Dfile.encoding= で文字コード設定を変えてみて下さい。

次はその設定で
System.out.println(new BufferedReader(new InputStreamReader(System.in)).readLine());

URLDecoder.decode(URLEncoder.encode(str,"UTF8"),"UTF8") は
上記がうまくいく設定でお試しください。

評価

0

思いつくことを手当たり次第やるのは、デバッグではない。
どこまでが想定どおりで、どこから想定と違うか、つまりどの箇所に原因があるか
を突き止めなければ、頓珍漢なことをしているだけになる可能性が高い。

評価

0

仙人さんの仰る通りでした。
System.inとSystem.outの両方を、文字コードを指定せずに表示させた場合で
あっても、実行した環境上(Eclipse Indigoのコンソール上, Windows)では文
字化けが発生しました。

デバッグした環境に問題があったようです。
原因がわかりすっきりしました。
皆様どうもありがとうございました。

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