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?
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.
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ı"
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 String
s 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();
}
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";
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 = الغلاف
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);
Apache Commons IO Charsets-Klasse kann nützlich sein:
String utf8String = new String(org.Apache.commons.io.Charsets.ISO_8859_1.encode(latinString).array())