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 파일이 생성되고 압축 파일을 열면 볼 수 있습니다. 파일 이름이 깨졌습니다. 아래 그림과 같이
프로그램이 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!