web-dev-qa-db-ja.com

Java)でUTF-8をISO-8859-1に変換する

XMLドキュメント(UTF-8)を読んでいて、最終的にISO-8859-1を使用してWebページにコンテンツを表示しています。予想どおり、(?と表示されます)など、正しく表示されない文字がいくつかあります。

これらの文字をUTF-8からISO-8859-1に変換することは可能ですか?

これを試みるために私が書いたコードの抜粋は次のとおりです。

BufferedReader br = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "UTF-8"));
StringBuilder sb = new StringBuilder();

String line = null;
while ((line = br.readLine()) != null) {
  sb.append(line);
}
br.close();

byte[] latin1 = sb.toString().getBytes("ISO-8859-1");

return new String(latin1);

何がうまくいかないのかよくわかりませんが、(文字列はJava/UTF-16でエンコードされているので)悲しみを引き起こしているのはreadLine()だと思います。私が試したもう1つのバリエーションは、latin1を

byte[] latin1 = new String(sb.toString().getBytes("UTF-8")).getBytes("ISO-8859-1");

私はこのテーマに関する以前の投稿を読んだことがあり、私は進むにつれて学んでいます。よろしくお願いします。

13
Chocula

デフォルトのエンコーディングによっては、次の行で問題が発生する可能性があります。

byte[] latin1 = sb.toString().getBytes("ISO-8859-1");

return new String(latin1);

Javaでは、String/Charは常にUTF-16BEにあります。異なるエンコーディングは、文字をバイトに変換する場合にのみ関係します。デフォルトのエンコーディングがUTF-8であるとすると、latin1バッファはUTF-8として扱われ、Latin-1の一部のシーケンスが無効なUTF-8シーケンスを形成する可能性があり、?が表示されます。

4
ZZ Coder

Java 8、 McDowellの答え を使用すると、次のように簡略化できます(代理ペアの正しい処理を維持しながら):

public final class HtmlEncoder {
    private HtmlEncoder() {
    }

    public static <T extends Appendable> T escapeNonLatin(CharSequence sequence,
                                                          T out) throws Java.io.IOException {
        for (PrimitiveIterator.OfInt iterator = sequence.codePoints().iterator(); iterator.hasNext(); ) {
            int codePoint = iterator.nextInt();
            if (Character.UnicodeBlock.of(codePoint) == Character.UnicodeBlock.BASIC_LATIN) {
                out.append((char) codePoint);
            } else {
                out.append("&#x");
                out.append(Integer.toHexString(codePoint));
                out.append(";");
            }
        }
        return out;
    }
}
2
robinst

stringオブジェクトをインスタンス化するときは、使用するエンコーディングを指定する必要があります。

だから交換してください:

return new String(latin1);

沿って

return new String(latin1, "ISO-8859-1");
1
fbaligand