Da scheint es einige Verwirrung darüber, ob dies möglich ist oder nicht, ich denke, ich muss ein umfangreiches Beispiel geben.
Die Frage behauptet, dass die (erste) Eingabe eine byte[]
ist, die Windows-1252 kodierte Daten enthält. Ich rufe das byte[]
ib
(für "anfängliche Bytes").
Für dieses Beispiel werde ich das deutsche Wort „Bär“ (was bedeutet, Bär) als Eingang wählen:
byte[] ib = new byte[] { (byte) 0x42, (byte) 0xE4, (byte) 0x72 };
String correctString = new String(ib, "Windows-1252");
assert correctString.charAt(1) == '\u00E4'; //verify that the character was correctly decoded.
(Wenn Ihr JVM nicht, dass die Codierung nicht unterstützt, dann können Sie mit ISO-8859 -1 stattdessen, weil diese drei Buchstaben (und die meisten anderen) in diesen beiden Kodierungen an der gleichen Position sind.
Die Frage geht es weiter, dass einige andere Code (also außerhalb unseres Einflusses ist) bereits umgesetzt, dass byte[]
in einen String mit der UTF-8-Codierung (ich nenne werde das String
is
für „input String“). Die String
ist der nur Eingang die unser Ziel, zur Verfügung zu erreichen (wenn is
vorhanden wären, wäre es trivial sein):
String is = new String(ib, "UTF-8");
System.out.println(is);
Dies erzeugt offensichtlich den falschen Ausgang „B“.
Das Ziel wäre, ib
(oder die korrekte Dekodierung dieser byte[]
) zur Verfügung mit nuris
zu produzieren.
nun einige Leute behaupten, dass das UTF-8-codiertes Bytes immer von diesen is
wird einen Array mit den gleichen Werten wie die anfänglichen Array zurück:
byte[] utf8Again = is.getBytes("UTF-8");
Aber das gibt die UTF-8-Codierung von die beiden Zeichen B
und �
und gibt definitiv das falsche Ergebnis, wenn neu interpretiert als Windows 1252:
System.out.println(new String(utf8Again, "Windows-1252");
Diese Linie erzeugt die Ausgabe „B "", was völlig falsch ist (es ist auch die gleiche Ausgabe, die das Ergebnis wäre, wenn das ursprüngliche Array stattdessen das Nicht-Wort "Bür" enthalten würde).
So in diesem Fall können Sie die Operation nicht rückgängig machen, weil Informationen verloren gehen.
Dort sind in der Tat Fälle, in denen solche Mis-Encodings rückgängig gemacht werden können. Es ist wahrscheinlicher, dass es funktioniert, wenn alle möglichen (oder zumindest vorkommenden) Bytefolgen in dieser Codierung gültig sind. Da UTF-8 mehrere Byte-Sequenzen hat, die einfach keine gültigen Werte sind, haben Sie Probleme.
Ich bekomme das Problem jetzt. Es tut uns leid. Es ist wie ein Überlauf-Problem während der Codierung eines _invalid_ UTF-8-Bytes [], das Datenverlust verursacht. Danke für den Unterricht. – nicerobot
Das ist das Unicode-Ersatzzeichen, das die drei Bytes 0xEF 0xBF 0xBD hat. –