golang zip에서 중국어 왜곡 코드를 처리하는 방법

PHPz
풀어 주다: 2023-04-24 15:21:56
원래의
767명이 탐색했습니다.

Golang 언어의 인기로 인해 점점 더 많은 사람들이 Golang을 사용하여 새로운 애플리케이션을 개발하기 시작했습니다. 일반적인 응용 프로그램 중 하나는 파일 시스템의 파일을 압축하여 ZIP 파일로 압축하는 것입니다. 특히 중국어 파일 이름을 다룰 때 문자가 깨져 나오는 문제가 발생하기 쉽습니다. 이 기사에서는 Golang zip의 중국어 문자 왜곡 문제를 해결하는 방법에 대해 설명합니다.

1. 문제 설명

Golang의 zip 패키지를 사용할 때 처리된 파일 이름에 한자가 포함되어 있으면 ZIP 파일로 출력할 때 글자가 깨져서 나타납니다. 아래 그림은 중국어 파일 이름이 포함된 디렉토리 구조를 보여줍니다.

example
├── file1.txt
└── 文件2.txt
로그인 후 복사

다음 코드를 사용하여 ZIP 파일로 패키징합니다.

package main

import (
    "archive/zip"
    "os"
    "path/filepath"
)

func main() {
    zipFileName := "example.zip"
    files := []string{"example/file1.txt", "example/文件2.txt"}

    // Create a new ZIP file.
    zipFile, err := os.Create(zipFileName)
    if err != nil {
        panic(err)
    }
    defer zipFile.Close()

    // Create a new writer to write to the ZIP file.
    zipWriter := zip.NewWriter(zipFile)
    defer zipWriter.Close()

    // Iterate over the files and add them to the ZIP file.
    for _, file := range files {
        addFileToZip(file, zipWriter)
    }
}

func addFileToZip(file string, zipWriter *zip.Writer) error {
    // Open the file to be added to the ZIP file.
    fileToZip, err := os.Open(file)
    if err != nil {
        return err
    }
    defer fileToZip.Close()

    // Get the file information for the file being added.
    fileInfo, err := fileToZip.Stat()
    if err != nil {
        return err
    }

    // Create a new file header for the file being added.
    header, err := zip.FileInfoHeader(fileInfo)
    if err != nil {
        return err
    }

    // Set the name for the file being added (this is what appears in the ZIP archive).
    header.Name = filepath.Base(file)

    // Add the file header to the ZIP archive.
    writer, err := zipWriter.CreateHeader(header)
    if err != nil {
        return err
    }

    // Copy the contents of the file into the ZIP archive.
    _, err = io.Copy(writer, fileToZip)
    if err != nil {
        return err
    }

    return nil
}
로그인 후 복사

이 프로그램을 실행하면 example.zip 파일이 생성되고 압축 파일을 열면 볼 수 있습니다. 파일 이름이 깨졌습니다. 아래 그림과 같이

golang zip에서 중국어 왜곡 코드를 처리하는 방법

프로그램이 zipWriter.CreateHeader(header)를 실행할 때 파일 이름을 처리하기 위해 기본적으로 UTF-8 인코딩을 사용하지만 파일 이름은 시스템 기본 인코딩을 사용하기 때문입니다. (제 경우에는 가운데가 GBK입니다.) 따라서 ZIP 파일을 작성할 때 왜곡이 발생합니다.

2. Solution

위 문제를 해결하려면 ZIP 파일을 작성하기 전에 파일 이름이 UTF-8 인코딩으로 변환되었는지 확인해야 합니다. 그러나 파일 이름은 시스템 기본 인코딩을 사용하여 생성될 수 있으므로 파일 이름의 인코딩 형식이 올바르게 식별되고 UTF-8 인코딩으로 변환되는지 확인해야 합니다.

다음은 위 단계를 구현하는 방법을 보여주는 간단한 예입니다.

package main

import (
    "archive/zip"
    "bytes"
    "io"
    "os"
    "path/filepath"
    "golang.org/x/text/encoding/simplifiedchinese"
    "golang.org/x/text/transform"
)

func main() {
    zipFileName := "example.zip"
    files := []string{"example/file1.txt", "example/文件2.txt"}

    // Create a new ZIP file.
    zipFile, err := os.Create(zipFileName)
    if err != nil {
        panic(err)
    }
    defer zipFile.Close()

    // Create a new writer to write to the ZIP file.
    zipWriter := zip.NewWriter(zipFile)
    defer zipWriter.Close()

    // Iterate over the files and add them to the ZIP file.
    for _, file := range files {
        addFileToZip(file, zipWriter)
    }
}

func addFileToZip(file string, zipWriter *zip.Writer) error {
    // Open the file to be added to the ZIP file.
    fileToZip, err := os.Open(file)
    if err != nil {
        return err
    }
    defer fileToZip.Close()

    // Get the file information for the file being added.
    fileInfo, err := fileToZip.Stat()
    if err != nil {
        return err
    }

    // Create a new file header for the file being added.
    header, err := zip.FileInfoHeader(fileInfo)
    if err != nil {
        return err
    }

    // Convert the file name to UTF-8.
    header.Name, err = toUTF8(fileInfo.Name())
    if err != nil {
        return err
    }

    // Add the file header to the ZIP archive.
    writer, err := zipWriter.CreateHeader(header)
    if err != nil {
        return err
    }

    // Copy the contents of the file into the ZIP archive.
    _, err = io.Copy(writer, fileToZip)
    if err != nil {
        return err
    }

    return nil
}

func toUTF8(src string) (string, error) {
    var (
        buf bytes.Buffer
        w   = transform.NewWriter(&buf, simplifiedchinese.GBK.NewDecoder())
    )
    _, err := w.Write([]byte(src))
    if err != nil {
        return "", err
    }
    err = w.Close()
    if err != nil {
        return "", err
    }
    return buf.String(), nil
}
로그인 후 복사

위 코드에서는 golang.org/x/text/transform 패키지를 사용하여 파일 이름을 GBK 형식에서 UTF-8 형식으로 변환합니다. . 먼저 패키지를 가져오고 toUTF8() 함수를 통해 파일 이름을 GBK에서 UTF-8 인코딩으로 변환합니다. 그런 다음 addFileToZip() 함수에서 Header.Name을 변환된 파일 이름으로 업데이트하고 이를 ZIP 파일에 추가합니다.

이 프로그램에서 생성된 ZIP 파일을 실행하면 파일명이 정상적으로 중국어로 표시됩니다.

요약

Golang zip 패키지를 사용할 때, 중국어 파일명이 있으면 ZIP 파일로 출력할 때 글자가 깨져 보이는 현상이 발생합니다. 이 문제를 해결하려면 먼저 파일 이름을 UTF-8 인코딩으로 변환하여 문자가 깨지는 것을 방지해야 합니다. 이 기사에서는 golang.org/x/text/transform 패키지를 사용하여 파일 이름을 GBK 형식에서 UTF-8 형식으로 변환했습니다. 이러한 방식으로 파일 이름을 ZIP 파일에 추가할 때 파일 이름이 왜곡되지 않도록 할 수 있습니다.

위 내용은 golang zip에서 중국어 왜곡 코드를 처리하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿