So konvertieren Sie einen UTF-8-string in Unicode?
Habe ich Zeichenfolge, die zeigt UTF-8-codierte Zeichen, und ich möchte Sie zu konvertieren zurück zu Unicode.
Für heute, meine Umsetzung ist die folgende:
public static string DecodeFromUtf8(this string utf8String)
{
//read the string as UTF-8 bytes.
byte[] encodedBytes = Encoding.UTF8.GetBytes(utf8String);
//convert them into unicode bytes.
byte[] unicodeBytes = Encoding.Convert(Encoding.UTF8, Encoding.Unicode, encodedBytes);
//builds the converted string.
return Encoding.Unicode.GetString(encodedBytes);
}
Spiele ich mit dem Wort "déjà"
. Ich habe konvertiert in UTF-8 durch dieses online-tool, und so begann ich zu testen, meine Methode mit der string "déjÃ"
.
Leider, mit dieser Umsetzung der saite gleich bleibt.
Wo bin ich falsch?
- Das ist nicht utf-8-string. Das ist eine beschädigte Zeichenfolge, die wurde schlecht konvertiert die bytes mit der falschen Codierung.
- UTF-8 ist Unicode.
- Die Quell-Zeichenfolge ungültig ist UTF-8.
- C# - strings 16-bit-Zeichen, also können Sie Sie möglicherweise nicht in UTF-8 codiert. Ich denke, dass das system nicht verstehen, was Sie zu tun versuchen. Wo bekommt man die miscoded strings aus?
- Die Funktion muss akzeptieren
byte[]
in den ersten Platz, nichtstring
. - und richard: Wenn es hilft, Lesen Sie "UTF-16" ist für "Unicode" in der Frage. C#'s native string-Kodierung ist UTF-16, und es wird als Unicode in die docs.
- Oh, wir haben also einen Fall von verwirrenden Terminologie.
- Da diese web-Seite ist in utf-8 ich freue mich auf die utf-8 für déjà und es sieht aus wie déjÃ.
- können Sie das konkretisieren, bitte? Wie können Sie sehen, meine UTF-8-string ist beschädigt? (Auch, ich aktualisierte meine Frage, um zu zeigen, wo ich es bekommen).
- Sie könnte beginnen mit Was Jeder Programmierer Absolut Positiv Muss Wissen Über Kodierungen Und Zeichensätzen Arbeiten Mit Text um zu verstehen, was Sie zu tun versuchen...
- C# - strings 16-bit - code-Einheiten. Unicode-Zeichen sind 21 bits, natürlich.
- Wieder verwirrende Terminologie. Die Grundeinheit einer Zeichenkette wird als eine
char
in C# (oder einChar
im .NET lingo) und Sie sind 16 bit. Aber es gibt keine solche Sache wie eine 21-bit-Unicode-Zeichen. Zumindest der Satz "der 21-bit-Zeichen" nicht erscheint überall auf der Unicode-Website, und keine Umsetzung in der Welt hat die 21 bits. (Übrigens habe ich vorgeschlagen, eine 24-bit-Codierung, die einmal (UTF-24), aber das wurde abgelehnt.) - utf unicode ?????? utf-8 ist eine Möglichkeit zum speichern von unicode-code-points
Du musst angemeldet sein, um einen Kommentar abzugeben.
Also das Problem ist, dass UTF-8-code Einheit Werte gespeichert wurden, als eine Folge von 16-bit-code-Einheiten in einem C# -
string
. Sie müssen einfach nur sicherstellen, dass jeder code-Einheit ist innerhalb des Bereichs von einem byte, kopieren Sie diese Werte in Byte umwandeln und dann die neuen UTF-8-byte-Sequenz in UTF-16.Dies ist einfach, jedoch wäre es am besten, um die Ursache; der Ort, wo jemand kopieren UTF-8-code-Einheiten in 16-bit-code-Einheiten. Der wahrscheinliche Täter ist jemand Konvertierung von bytes in ein C#
string
mit der falschen Codierung. E. g.Encoding.Default.GetString(utf8Bytes, 0, utf8Bytes.Length)
.Alternativ, wenn Sie sicher sind, dass Sie wissen, die falsche Codierung, die verwendet wurde, um zu produzieren die Zeichenfolge, und dass eine falsche Codierung transformation verlustfrei (in der Regel der Fall, wenn die falsche Codierung ist ein single-byte-Codierung), dann kann man einfach die inverse Codierung Schritt, um die ursprüngliche UTF-8-Daten, und dann können Sie die korrekte Konvertierung von UTF-8-bytes:
Gibt es keine solche Sache .NET. Die string-Klasse können nur strings speichern in UTF-16-Codierung. Ein UTF-8 kodierter string kann nur existieren als byte[]. Versuchen, speichern von bytes in eine Zeichenfolge wird nicht kommen, zu einem guten Ende; UTF-8 verwendet, byte-Werte, die nicht über eine gültige Unicode-codepoint. Der Inhalt wird vernichtet werden, wenn der string wird normalisiert. So ist es bereits zu spät, sich zu erholen, den string durch die Zeit, Ihre DecodeFromUtf8() beginnt zu laufen.
Nur mit der Zeichenkodierung UTF-8 mit byte[]. Und verwenden Sie bei UTF8Encoding.GetString() zu konvertieren.
déjÃ
. Also, mein Ziel ist es, ein weiteres (.Net) der string, der angezeigt wird, wiedéjà
(in den debugger, zum Beispiel).string
zur Speicherung der UTF-8-bytes. Jedoch, wie Sie erwähnen, könnte es durch einen Unfall, wäre es eine große Hilfe, wenn ich könnte die Unfälle arbeiten. In anderen Worten, ich weiß noch nicht, wie man diese Umwandlung in den Fällen, die es funktionieren würde.byte[]
von diesem berüchtigten UTF-8-string. In diesem array, bemerkte ich, dass alle ungeraden Indizes enthält0
, so dass ich entfernt Sie alle und aufgerufenunicodeBytes = Encoding.Convert(Encoding.UTF8, Encoding.Unicode, encodedBytes);
auf dieses Ergebnis. Am Ende kehrte ich zurückEncoding.Unicode.GetString(unicodeBytes);
. Dann, ich nahm Lasten von text-Beispiele in vielen Sprachen (Dank Wikipedia), baute einen großen großen string, konvertiert es in meiner berühmt-berüchtigten UTF-8-format, dann dekodiert es und habe die exakt gleichen ursprünglichen string. Kein Zufall, kein Unfall.Wenn Sie eine UTF-8-Zeichenkette, wobei jedes byte richtig ist ('Ö' -> [195, 0] , [150, 0]), Sie können die folgenden:
In meinem Fall die DLL Ergebnis ist ein UTF-8 string zu, aber leider ist die UTF-8-string interpretiert, wenn UTF-16-Codierung ('Ö' -> [195, 0], [19, 32]).
Also der ANSI '–' 150 konvertiert die UTF-16 -'–', was ist 8211. Wenn Sie dieser Fall zu, können Sie den folgenden statt:
Oder die Native-Methode:
Wenn Sie müssen es anders herum sehen Utf16ToUtf8.
Hoffe ich konnte helfen.
Was Sie zu sein scheint
string
falsch dekodiert aus einer anderen Codierung, wahrscheinlich code-Seite 1252, die UNS Windows-Standard. Hier ist, wie rückgängig, vorausgesetzt, dass keine weiteren Verluste. Ein Verlust, der nicht sofort ersichtlich ist dienon-breaking space
(U+geschützte Leerzeichen 00A0) am Ende der Zeichenfolge, die nicht angezeigt wird. Natürlich wäre es besser, die Daten zu Lesen-Quelle korrekt in den ersten Platz, aber vielleicht ist die Datenquelle gespeichert wurde, falsch zu beginnen.Ergebnis: