1157 Stimmen

Wie konvertiert man UTF-8 byte[] in string

J'ai un byte[] Array, das aus einer Datei geladen wird, von der ich zufällig weiß, dass sie UTF-8 .

In einigen Debugging-Codes muss ich sie in eine Zeichenkette umwandeln. Gibt es einen Einzeiler, der dies tut?

Unter der Haube sollte es nur eine Zuweisung und eine memcopy Auch wenn es nicht umgesetzt wird, sollte es also möglich sein.

7 Stimmen

"sollte nur eine Zuweisung und eine Speicherkopie sein": ist nicht korrekt, da eine .NET-Zeichenkette UTF-16 kodiert ist. Ein Unicode-Zeichen kann eine UTF-8-Code-Einheit oder eine UTF-16-Code-Einheit sein. Ein anderes kann zwei UTF-8-Code-Einheiten oder eine UTF-16-Code-Einheit sein, ein anderes kann drei UTF-8-Code-Einheiten oder eine UTF-16-Code-Einheit sein, ein anderes kann vier UTF-8-Code-Einheiten oder zwei UTF-16-Code-Einheiten sein. Eine Memkopie könnte zwar erweitert werden, aber sie wäre nicht in der Lage, die Konvertierung von UTF-8 nach UTF-16 zu bewältigen.

1788voto

Zanoni Punkte 28468
string result = System.Text.Encoding.UTF8.GetString(byteArray);

19 Stimmen

Wie werden null endende Zeichenketten behandelt?

19 Stimmen

@maazza aus unbekanntem Grund überhaupt nicht. Ich rufe es wie System.Text.Encoding.UTF8.GetString(buf).TrimEnd('\0'); .

20 Stimmen

@Hi-Angel Unbekannter Grund? Der einzige Grund, warum null-terminierte Zeichenketten jemals populär wurden, war die Sprache C - und selbst das war nur wegen einer historischen Merkwürdigkeit (CPU-Anweisungen, die mit null-terminierten Zeichenketten umgehen). .NET verwendet nullterminierte Zeichenketten nur dann, wenn es mit Code interagiert, der nullterminierte Zeichenketten verwendet (das sind schließlich verschwinden). Es ist durchaus zulässig, dass eine Zeichenkette NUL-Zeichen enthält. Und während null-terminierte Zeichenketten in ASCII ganz einfach sind (man braucht nur bis zum ersten Null-Byte zu bauen), sind andere Kodierungen, einschließlich UTF-8, nicht so einfach.

388voto

detale Punkte 11524

Es gibt mindestens vier verschiedene Möglichkeiten, diese Umwandlung vorzunehmen.

  1. GetString von Encoding
    aber Sie werden nicht in der Lage sein, die ursprünglichen Bytes zurückzubekommen, wenn diese Bytes Nicht-ASCII-Zeichen enthalten.

  2. BitConverter.ToString
    Die Ausgabe ist eine durch "-" begrenzte Zeichenkette, aber es gibt keine in .NET integrierte Methode, um die Zeichenkette wieder in ein Byte-Array zu konvertieren.

  3. Convert.ToBase64String
    Sie können die ausgegebene Zeichenkette leicht wieder in ein Byte-Array umwandeln, indem Sie Convert.FromBase64String .
    Hinweis: Die Ausgabezeichenfolge kann '+', '/' und '=' enthalten. Wenn Sie die Zeichenfolge in einer URL verwenden wollen, müssen Sie sie explizit kodieren.

  4. HttpServerUtility.UrlTokenEncode
    Sie können die ausgegebene Zeichenkette leicht wieder in ein Byte-Array umwandeln, indem Sie HttpServerUtility.UrlTokenDecode . Der Ausgabestring ist bereits URL-freundlich! Der Nachteil ist, dass er System.Web Montage, wenn es sich bei Ihrem Projekt nicht um ein Webprojekt handelt.

Ein vollständiges Beispiel:

byte[] bytes = { 130, 200, 234, 23 }; // A byte array contains non-ASCII (or non-readable) characters

string s1 = Encoding.UTF8.GetString(bytes); // 
byte[] decBytes1 = Encoding.UTF8.GetBytes(s1);  // decBytes1.Length == 10 !!
// decBytes1 not same as bytes
// Using UTF-8 or other Encoding object will get similar results

string s2 = BitConverter.ToString(bytes);   // 82-C8-EA-17
String[] tempAry = s2.Split('-');
byte[] decBytes2 = new byte[tempAry.Length];
for (int i = 0; i < tempAry.Length; i++)
    decBytes2[i] = Convert.ToByte(tempAry[i], 16);
// decBytes2 same as bytes

string s3 = Convert.ToBase64String(bytes);  // gsjqFw==
byte[] decByte3 = Convert.FromBase64String(s3);
// decByte3 same as bytes

string s4 = HttpServerUtility.UrlTokenEncode(bytes);    // gsjqFw2
byte[] decBytes4 = HttpServerUtility.UrlTokenDecode(s4);
// decBytes4 same as bytes

7 Stimmen

LINQ it: var decBytes2 = str.Split('-').Select(ch => Convert.ToByte(ch, 16)).ToArray();

2 Stimmen

Dies sollte die a

37voto

Nir Punkte 1600

Eine allgemeine Lösung zur Konvertierung von Byte-Array in String, wenn Sie die Kodierung nicht kennen:

static string BytesToStringConverted(byte[] bytes)
{
    using (var stream = new MemoryStream(bytes))
    {
        using (var streamReader = new StreamReader(stream))
        {
            return streamReader.ReadToEnd();
        }
    }
}

5 Stimmen

Dies setzt jedoch voraus, dass

14voto

Erçin Dedeoğlu Punkte 4262

Definition:

public static string ConvertByteToString(this byte[] source)
{
    return source != null ? System.Text.Encoding.UTF8.GetString(source) : null;
}

Verwenden:

string result = input.ConvertByteToString();

11voto

Antonio Leonardo Punkte 1168

Ich habe einige Antworten auf diesen Beitrag gesehen und es ist möglich, als abgeschlossenes Basiswissen zu gelten, da ich mehrere Ansätze in der C#-Programmierung habe, um das gleiche Problem zu lösen. Die einzige Sache, die notwendig ist, zu berücksichtigen ist über einen Unterschied zwischen reines UTF-8 y UTF-8 mit einem STÜCKLISTE .

Letzte Woche musste ich bei meiner Arbeit eine Funktion entwickeln, die CSV-Dateien mit einer Stückliste und andere CSV-Dateien mit reinem UTF-8 (ohne Stückliste) ausgibt. Jede CSV-Datei Kodierung Typ wird von verschiedenen nicht standardisierten APIs verwendet. Eine API liest UTF-8 mit einem BOM und die andere API liest ohne BOM. Ich musste in den Referenzen zu diesem Konzept recherchieren und las die " Was ist der Unterschied zwischen UTF-8 und UTF-8 ohne BOM? " Stack Overflow-Frage und der Wikipedia-Artikel _" Byte-Order-Marke "_ um meinen Ansatz zu entwickeln.

Schließlich musste meine C#-Programmierung für beide UTF-8-Kodierungstypen (mit BOM und rein) ähnlich wie dieses Beispiel unten sein:

// For UTF-8 with BOM, equals shared by Zanoni (at top)
string result = System.Text.Encoding.UTF8.GetString(byteArray);

//for Pure UTF-8 (without B.O.M.)
string result = (new UTF8Encoding(false)).GetString(byteArray);

0 Stimmen

Müssen Sie sich nicht besonders anstrengen, um

0 Stimmen

@Nyerguds, die U

0 Stimmen

Nein, ich meine, wenn der Text eine System.Text.Encoding.UTF8 wird pas automatisch st

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X