web-dev-qa-db-ja.com

JavaでISO-8859-1とUTF-8を変換するにはどうすればよいですか?

文字列をISO-8859-1からUTF-8に変換し、Javaに戻す方法を知っている人はいますか?

Webから文字列を取得してRMS(J2ME)に保存していますが、特殊文字を保持し、RMSから文字列を取得したいのですが、ISO -8859-1エンコード。どうすればいいですか?

63
c4r1o5

一般に、これはできません。 UTF-8は、Unicodeコードポイントをエンコードできます。 ISO-8859-1は、ほんの一部しか処理できません。したがって、ISO-8859-1からUTF-8へのトランスコーディングは問題ありません。 UTF-8からISO-8859-1に戻ると、サポートされていない文字が見つかったときにテキストに「置換文字」(�)が表示されます。

テキストをトランスコードするには:

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

または

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

下位レベルの Charset APIを使用することで、より細かく制御できます。たとえば、エンコードできない文字が見つかった場合に例外を発生させたり、置換テキストに別の文字を使用したりできます。

93
erickson

私のために働いた:( "üzümbağları"はトルコ語で書かれた正しいです)

ISO-8859-1をUTF-8に変換します。

String encodedWithISO88591 = "üzüm baÄları";
String decodedToUTF8 = new String(encodedWithISO88591.getBytes("ISO-8859-1"), "UTF-8");
//Result, decodedToUTF8 --> "üzüm bağları"

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

String encodedWithUTF8 = "üzüm bağları";
String decodedToISO88591 = new String(encodedWithUTF8.getBytes("UTF-8"), "ISO-8859-1");
//Result, decodedToISO88591 --> "üzüm baÄları"
9

Stringがあれば、それを行うことができます:

String s = "test";
try {
    s.getBytes("UTF-8");
} catch(UnsupportedEncodingException uee) {
    uee.printStackTrace();
}

「壊れた」Stringがある場合は、何か間違ったことをしました。別のエンコーディングでStringStringに変換することは、間違いなく進むべき方法ではありません。 Stringbyte[]に、またはその逆に変換できます(エンコードが指定された場合)。 Java Stringsでは、UTF-16でエンコードされたAFAIKですが、これは実装の詳細です。

InputStreamがある場合、byte[]を読み取り、それを使用してStringに変換できます

byte[] bs = ...;
String s;
try {
    s = new String(bs, encoding);
} catch(UnsupportedEncodingException uee) {
    uee.printStackTrace();
}

またはさらに良い(エリクソンのおかげで)InputStreamReaderを使用してください:

InputStreamReader isr;
try {
     isr = new InputStreamReader(inputStream, encoding);
} catch(UnsupportedEncodingException uee) {
    uee.printStackTrace();
}
6
Johannes Weiss

文字列出力を使用した簡単な方法を次に示します(これを行うメソッドを作成しました)。

public static String (String input){
    String output = "";
    try {
        /* From ISO-8859-1 to UTF-8 */
        output = new String(input.getBytes("ISO-8859-1"), "UTF-8");
        /* From UTF-8 to ISO-8859-1 */
        output = new String(input.getBytes("UTF-8"), "ISO-8859-1");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    return output;
}
// Example
input = "Música";
output = "Música";
3
JLeon90

正規表現も有効で効果的に使用できます(ISO-8859-1でカバーされていないすべてのUTF-8文字をスペースに置き換えます):

String input = "€Tes¶ti©ng [§] al€l o€f i¶t _ - À ÆÑ with some 9umbers as"
            + " w2921**#$%!@# well Ü, or ü, is a chaŒracte⚽";
String output = input.replaceAll("[^\\u0020-\\u007e\\u00a0-\\u00ff]", " ");
System.out.println("Input = " + input);
System.out.println("Output = " + output);
1
Pritam Banerjee

以下は、UNICODE(ISO_8859_1)をUTF-8に変換する関数です

public static String String_ISO_8859_1To_UTF_8(String strISO_8859_1) {
final StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < strISO_8859_1.length(); i++) {
  final char ch = strISO_8859_1.charAt(i);
  if (ch <= 127) 
  {
      stringBuilder.append(ch);
  }
  else 
  {
      stringBuilder.append(String.format("%02x", (int)ch));
  }
}
String s = stringBuilder.toString();
int len = s.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
    data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                         + Character.digit(s.charAt(i+1), 16));
}
String strUTF_8 =new String(data, StandardCharsets.UTF_8);
return strUTF_8;
}

TEST

String strA_ISO_8859_1_i = new String("الغلاف".getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);

System.out.println("ISO_8859_1 strA est = "+ strA_ISO_8859_1_i + "\n String_ISO_8859_1To_UTF_8 = " + String_ISO_8859_1To_UTF_8(strA_ISO_8859_1_i));

結果

ISO_8859_1 strA est =اÙغÙاÙString_ISO_8859_1To_UTF_8 =الغلاف

0
che.moor

Apache Commons IO Charsets class が役立ちます:

String utf8String = new String(org.Apache.commons.io.Charsets.ISO_8859_1.encode(latinString).array())
0
Alberto Segura