wake-up-neo.com

Wie kann ich in Java zwischen ISO-8859-1 und UTF-8 konvertieren?

Weiß jemand, wie man einen String von ISO-8859-1 in UTF-8 und zurück in Java konvertiert?

Ich bekomme einen String aus dem Web und speichere ihn im RMS (J2ME), aber ich möchte die Sonderzeichen beibehalten und den String vom RMS erhalten, jedoch mit dem ISO-8859-1 Codierung. Wie mache ich das?

62
c4r1o5

Im Allgemeinen können Sie das nicht tun. UTF-8 kann beliebige Unicode-Codepunkte kodieren. ISO-8859-1 kann nur einen Bruchteil davon handhaben. Die Transcodierung von ISO-8859-1 nach UTF-8 ist somit kein Problem. Wenn Sie von UTF-8 zu ISO-8859-1 wechseln, werden in Ihrem Text "Ersatzzeichen" ( ) angezeigt, wenn nicht unterstützte Zeichen gefunden werden.

So kodieren Sie Text:

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

oder 

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

Sie können mehr Kontrolle ausüben, indem Sie die untergeordneten Charset - APIs verwenden. Sie können beispielsweise eine Ausnahme auslösen, wenn ein nicht kodierbares Zeichen gefunden wird, oder ein anderes Zeichen für den Ersetzungstext verwenden.

92
erickson

Was für mich funktionierte:("üzüm bağları" ist das richtige in türkischer Sprache)}

Konvertieren Sie ISO-8859-1 in 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ı"

Konvertieren Sie UTF-8 in 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ı"
7

Wenn Sie eine String haben, können Sie das tun:

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

Wenn Sie String "defekt" haben, haben Sie etwas falsch gemacht. Das Konvertieren eines String in ein String in einer anderen Codierung ist definitiv nicht der richtige Weg! Sie können eine String in eine byte[] umwandeln und umgekehrt (mit einer Kodierung). In Java sind Strings mit UTF-16 AFAIK codiert, dies ist jedoch ein Implementierungsdetail.

Angenommen, Sie haben ein InputStream. Sie können einen byte[] lesen und dieses dann mit String konvertieren

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

oder sogar besser (dank erickson) InputStreamReader so verwenden:

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

Hier ist eine einfache Möglichkeit mit der String-Ausgabe (ich habe dazu eine Methode erstellt):

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

Hier ist eine Funktion zum Konvertieren von UNICODE (ISO_8859_1) in 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;
}

PR&UUML;FUNG

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));

ERGEBNIS

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

0
che.moor

Regex kann auch gut sein und effektiv verwendet werden (Ersetzt alle UTF-8-Zeichen, die nicht in ISO-8859-1 enthalten sind, durch Leerzeichen):

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

Apache Commons IO Charsets-Klasse kann nützlich sein:

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