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");
私はこのテーマに関する以前の投稿を読んだことがあり、私は進むにつれて学んでいます。よろしくお願いします。
デフォルトのエンコーディングによっては、次の行で問題が発生する可能性があります。
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シーケンスを形成する可能性があり、?が表示されます。
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;
}
}
stringオブジェクトをインスタンス化するときは、使用するエンコーディングを指定する必要があります。
だから交換してください:
return new String(latin1);
沿って
return new String(latin1, "ISO-8859-1");