42596


以下のコードを走らせると、取得したデータの文字列が以下の画像のように一部化けて変換されます。

[code]

    try {
        // 接続用HttpURLConnectionオブジェクト作成
        HttpURLConnection con = null;
        // URLの作成
        URL urlSt = "https://cs.kintetsu-ls.co.jp/TR/TRGG0020/TRGG0020.aspx?ID=1234567890";
        url = new URL(urlSt);
        con = (HttpURLConnection) url.openConnection();
        // リダイレクトを自動で許可しない設定
        con.setInstanceFollowRedirects(false);
        // URL接続からデータを読み取る場合はtrue
        con.setDoInput(true);
        // URL接続にデータを書き込む場合はtrue
        con.setDoOutput(true);
        // 接続
        con.connect();
        // 本文の取得
        InputStream in = con.getInputStream();
        String readSt = readInputStream(in);
        //文字コードを指定して変換する
        readSt = new String(readSt.getBytes("Shift_JIS"));
    
        System.out.println(readSt);//ここでブレークを張って、デバックエリアでreadStの中を覗いて取得文字をキャプチャ
    
        //切断
        in.close();
        con.disconnect();
    
        } catch (IOException e) {
            try {
                if (con != null) con.disconnect();
            } catch (Exception e2) {
            }
            e.printStackTrace();
        }
    
    
    public String readInputStream(InputStream in) throws IOException, UnsupportedEncodingException {
        StringBuffer sb = new StringBuffer();
        String st = "";
    
        BufferedReader br = new BufferedReader(new InputStreamReader(in, "Shift_JIS"));
        while((st = br.readLine()) != null) {
            sb.append(st);
        }
        try {
            in.close();
        }
        catch(Exception e) {
            e.printStackTrace();
        }
        return sb.toString();
    }
    
[/code]

[![Shift-
JIS変換後の文字列](https://i.stack.imgur.com/69jbh.png)](https://i.stack.imgur.com/69jbh.png)

このように一部文字が化ける場合、どのようにしたら良いのでしょうか。

ご教示いただければ幸いです。

PS:UTF-8を指定すると、以下のようになります。

[![UTF-8の結果](https://i.stack.imgur.com/zkM58.png)](https://i.stack.imgur.com/zkM58.png)

以下が変換前です。

[![変換前](https://i.stack.imgur.com/tbZYr.png)](https://i.stack.imgur.com/tbZYr.png)


CC BY-SA 3.0
2018-03-22T10:01:32.093
42575
2018-03-23T02:54:05.413
2018-03-23T01:19:56.450
10845
10845
question
android java
JavaでHTMLを取得し、getBytesで文字コードを変換すると「一部」文字化けする

[code]

    // バイト列をShift_JISとして解釈してUTF-16に変換
    BufferedReader br = new BufferedReader(new InputStreamReader(in, "Shift_JIS"));
    ...
    // UTF-16をShift_JISのバイト列に変換
    byte[] bytes = readSt.getBytes("Shift_JIS")
    // Shift_JISのバイト列を(デフォルトのUTF-8として解釈して)UTF-16に変換する
    readSt = new String(bytes);
    
[/code]

という流れになっているので、元のHTMLのUTF-8バイト列をShift_JISとして解釈、そのShift_JISをUTF-8として解釈という処理になっていて、たまたま共通のコードがある一部だけ2重に化けて正しいかのように見えている状態です。

`BufferedReader br = new BufferedReader(new InputStreamReader(in,
"UTF-8"));`で読み込んだ文字列を`getBytes()`や`new String()`せずにそのまま使えば問題ないはずです。


CC BY-SA 3.0
2018-03-23T02:54:05.413
42596
2018-03-23T02:54:05.413
241
42575
answer