Heim  >  Artikel  >  Backend-Entwicklung  >  Golang schreibt verstümmelte Dateien

Golang schreibt verstümmelte Dateien

WBOY
WBOYOriginal
2023-05-10 09:36:361000Durchsuche

Das Schreiben von Daten in eine Datei in Golang ist ein grundlegender Vorgang. In einigen Fällen treten jedoch nach dem Schreiben der Datei verstümmelte Zeichen auf. In der Datei werden einige falsche Zeichen angezeigt, was zu Fehlern beim Lesen der Datei führt. Daher wird in diesem Artikel das Problem der von Golang geschriebenen verstümmelten Dateien und deren Lösung erörtert.

Der Grund für verstümmelte Zeichen

Der Grund für verstümmelte Zeichen ist, dass das Codierungsformat der Datei nicht mit dem Codierungsformat der vom Programm geschriebenen Daten übereinstimmt. Golang verwendet standardmäßig das UTF-8-Codierungsformat. Wenn die Dateien unterschiedliche Kodierungsformate verwenden, kommt es zu verstümmelten Zeichen. Zu den spezifischen Situationen gehören die folgenden:

Das Kodierungsformat der Datei selbst ist falsch.

Wenn das Kodierungsformat der Datei falsch ist, erzeugt Golang beim Schreiben der Datei verstümmelte Zeichen. Wenn das Codierungsformat der Datei beispielsweise GBK ist und die geschriebenen Daten UTF-8-Codierung verwenden, werden in der Datei falsche Zeichen angezeigt.

Unterschiedliche Spracheinstellungen des Betriebssystems

Unterschiede in den Spracheinstellungen des Betriebssystems können ebenfalls zu verstümmelten Zeichen führen. Wenn das Golang-Programm auf einem Betriebssystem ausgeführt wird, das eine andere Sprache verwendet, enthält die geschriebene Datei möglicherweise den Standardzeichensatz des Betriebssystems und die Ausgabe des Golang-Programms wird durch die UTF-8-Codierung beeinträchtigt.

Lösung

Option 1: Verwendung des UTF-8-Kodierungsformats erzwingen

Die einfachste Lösung besteht darin, die Verwendung des UTF-8-Kodierungsformats beim Schreiben von Dateien zu erzwingen. Zu diesem Zweck können Sie das Paket „unicode/utf8“ aus der Go-Standardbibliothek verwenden.

In diesem Paket verwenden Sie die Funktion BytesRune(), um utf8-Strings in Byte-Slices zu konvertieren. Als nächstes verwenden Sie „os.File“, um die Datei zu öffnen und verwenden Sie die Funktion „Write()“ oder „WriteString()“, um dieses Byte-Slice in die Datei zu schreiben. Der Beispielcode lautet wie folgt:

import (
    "os"
    "unicode/utf8"
)

func main() {
    file, err := os.Create("test.txt")
    if err != nil {
        panic(err)
    }
    defer file.Close()

    str := "hello world"
    byteArr := []byte(str)

    // 将str强制转换为utf8编码的byte数组
    utf8Byte := make([]byte, len(byteArr))
    count := 0
    for len(byteArr) > 0 {
        size := 0
        c := make([]byte, 4)
        if utf8.ValidRune(rune(byteArr[0])) {
            size = 1
            c[0] = byteArr[0]
        } else {
            size = utf8.EncodeRune(rune(c[0]), rune(byteArr[0]))
        }
        utf8Byte[count] = c[0]
        count++
        byteArr = byteArr[size:]
    }

    // 将utf8编码的byte数组写入文件
    _, err = file.Write(utf8Byte)
    if err != nil {
        panic(err)
    }
}

Im obigen Code wird die Funktion ValidRune() verwendet, um zu bestimmen, ob das Element im Byte-Slice ein zulässiges Runenzeichen ist. Ist dies nicht der Fall, wird das angegebene Runenzeichen mithilfe der Funktion EncodeRune() in ein UTF8-Zeichen konvertiert und in den angegebenen Bytes gespeichert.

Diese Methode kann jedoch nur erzwingen, dass die Datei im UTF-8-Codierungsformat geschrieben wird. Wenn das Codierungsformat der Datei GBK ist, kann diese Methode das Problem nicht lösen.

Option 2: Gepufferte Schreibvorgänge mit dem „io“-Paket

Eine andere Lösung besteht darin, gepufferte Schreibvorgänge aus dem „io“-Paket zu verwenden. Der Vorteil des Puffers besteht darin, dass er die Anzahl der Systemaufrufe reduzieren und die Leistung beim Schreiben von Dateien verbessern und das Schreiben verstümmelter Zeichen vermeiden kann.

Um gepuffertes Schreiben aus dem io-Paket zu verwenden, erstellen Sie einfach einen gepufferten Writer und verwenden Sie die Funktion Write() oder WriteString(), um Daten in den Puffer zu schreiben. Wenn der Puffer voll ist, wird automatisch die Funktion Flush() aufgerufen, um die Daten im Puffer in die Datei zu schreiben.

Das Folgende ist der Beispielcode:

import (
    "bufio"
    "os"
)

func main() {
    file, err := os.Create("test.txt")
    if err != nil {
        panic(err)
    }
    defer file.Close()

    writer := bufio.NewWriter(file)
    str := "hello world"
    _, err = writer.WriteString(str)
    if err != nil {
        panic(err)
    }
    err = writer.Flush()
    if err != nil {
        panic(err)
    }
}

Im obigen Code wird die NewWriter()-Funktion des bufio-Pakets verwendet, um einen gepufferten Writer zu erstellen. Verwenden Sie dann die Funktion WriteString(), um die Daten in den Puffer zu schreiben. Verwenden Sie abschließend die Funktion Flush(), um Daten aus dem Puffer in die Datei zu schreiben.

In diesem Fall wird der Puffer automatisch geleert, bevor er voll ist, um das Schreiben verstümmelter Zeichen zu vermeiden.

Zusammenfassung

Das Problem der von Golang geschriebenen verstümmelten Dateien wird durch die Nichtübereinstimmung zwischen dem Dateikodierungsformat und dem Kodierungsformat des Golang-Programms verursacht. Um dieses Problem zu lösen, können Sie die Verwendung des UTF-8-Codierungsformats erzwingen oder den gepufferten Schreibvorgang des io-Pakets verwenden. Unabhängig davon, welche Methode verwendet wird, müssen Sie das Codierungsformat der Datei verstehen und sie entsprechend der tatsächlichen Situation verarbeiten.

Das obige ist der detaillierte Inhalt vonGolang schreibt verstümmelte Dateien. 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