Heim  >  Artikel  >  Backend-Entwicklung  >  So lösen Sie das Problem der verstümmelten Golang-Bytes

So lösen Sie das Problem der verstümmelten Golang-Bytes

PHPz
PHPzOriginal
2023-03-31 10:24:391523Durchsuche

Da die Go-Sprache in den letzten Jahren immer beliebter wurde, entscheiden sich immer mehr Menschen für die Verwendung der Go-Sprache zur Entwicklung von Projekten. Bei der Verwendung der Go-Sprachentwicklung treten jedoch manchmal unerklärliche Probleme auf. Eines der häufigsten Probleme ist das Problem der Byte-Verstümmelung. Als Nächstes werden wir das Problem der Byte-Verstümmelung im Detail vorstellen und einige Lösungen bereitstellen.

Zunächst müssen wir wissen, was Byte ist. In der Go-Sprache ist Byte ein natürlicher Zahlentyp, der einen 8-Bit-Bytewert (8-Bit-Ganzzahlen ohne Vorzeichen) darstellt und zur Darstellung von ASCII-Zeichen verwendet werden kann. Rune ist eine Ganzzahl, die ein Unicode-Zeichen darstellt und zur Darstellung von ASCII-Zeichen und anderen Multibyte-Zeichen verwendet werden kann. Normalerweise verwenden wir Zeichenfolgen zum Speichern von Zeichen, und Byte-Slices ([] Byte) werden zum Speichern der Bytesequenz von ASCII-Codezeichenfolgen verwendet, dh ein Zeichen entspricht einem Byte.

Wenn wir Zeichen in Byte-Slices konvertieren (d. h. Zeichenfolgen in []Byte umwandeln), treten manchmal verstümmelte Zeichen auf. Zum Beispiel der folgende Code:

func main() {
    str := "你好,世界!"
    b := []byte(str)
    fmt.Println(b)
}

Das Ausgabeergebnis ist:

[228 189 160 229 165 189 239 188 129 231 149 140 239 188 154 33]

Wie Sie sehen können, gibt das Programm nicht das erwartete „Hallo Welt!“ aus, sondern eine Reihe verstümmelter Zeichen. Warum ist das so?

Tatsächlich liegt dies daran, dass die unterste Ebene der Zeichenfolge in der Go-Sprache ein Byte-Array ist. Beim Konvertieren einer Zeichenfolge in ein Byte-Slice werden die Zeichen in der Zeichenfolge einzeln in den Byte-Typ konvertiert. Bei der UTF-8-Kodierung sind chinesische Zeichen 3 Byte lang, während ein englischer Buchstabe nur 1 Byte lang ist. Wenn wir chinesische Zeichen in Bytes konvertieren, müssen wir daher 3 Bytes belegen, aber bei der Konvertierung von Zeichenfolgen in [] Bytes belegt jedes Zeichen nur ein Byte, sodass das Problem verstümmelter Zeichen auftritt.

Zum Beispiel entsprechen die beiden Zeichen „Hallo“ der Hexadezimalkodierung E4BDA0 E5A5BD in der UTF-8-Kodierung. Das Ergebnis der Konvertierung in den Byte-Typ ist:

[]byte{0xE4, 0xBD, 0xA0, 0xE5, 0xA5, 0xBD}

Wenn Sie zwei Bytes direkt verbinden, erhalten Sie Folgendes:

[]byte{0xE4, 0xBD, 0xA0, 0xE5, 0xA5, 0xBD}

Dies führt zu Problemen mit verstümmeltem Code. Daher müssen wir beim Konvertieren eines Strings in ein Byte-Slice die entsprechenden Funktionen im String-Paket für die Konvertierung verwenden, wie z. B. strconv.Atoi(), strconv.ParseInt(), strconv.ParseUint(), strconv.ParseFloat() , strconv. Quote() und so weiter.

Natürlich können wir in einigen Sonderfällen den String auch manuell in den Byte-Typ konvertieren, anstatt die Funktionen im String-Paket zu verwenden. Die spezifische Operationsmethode lautet wie folgt:

func main() {
    str := "你好,世界!"
    b := make([]byte, len(str)*3)
    blen := 0
    for _, runeValue := range str {
        c := utf8.EncodeRune(b[blen:], runeValue)
        blen += c
    }
    fmt.Println(b[:blen])
}

Das Ausgabeergebnis lautet:

[228 189 160 229 165 189 239 188 129 231 149 140 239 188 154 33]

Es ist ersichtlich, dass das Ergebnis unserer manuellen Konvertierung mit dem Ergebnis übereinstimmt, das durch die Verwendung der Funktion im Zeichenfolgenpaket erzielt wurde.

Zusätzlich zu den oben genannten Methoden können wir auch Bibliotheken von Drittanbietern verwenden, um das Problem der Byte-Verstümmelung zu lösen, z. B. GORM, Goka, gRPC usw.

Kurz gesagt, wenn wir die Go-Sprache zum Entwickeln von Projekten verwenden, müssen wir auf das Problem byteverstümmelter Zeichen achten und so weit wie möglich Funktionen im String-Paket für die Konvertierung verwenden oder Bibliotheken von Drittanbietern verwenden. Nur wenn wir dieses Problem richtig lösen, können wir die Go-Sprache besser für die Entwicklungsarbeit nutzen.

Das obige ist der detaillierte Inhalt vonSo lösen Sie das Problem der verstümmelten Golang-Bytes. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn