golang zip 잘못된 코드

王林
풀어 주다: 2023-05-27 13:46:39
원래의
659명이 탐색했습니다.

파일 압축에 Golang을 사용할 때 압축 파일 이름이 왜곡되는 문제가 발생할 수 있습니다. 이러한 문제가 발생하는 이유는 Golang의 Zip 라이브러리가 파일 압축 시 한자를 잘 처리하지 못하기 때문입니다.

일반적으로 한자는 컴퓨터에 유니코드 문자 인코딩으로 저장됩니다. Zip 형식의 파일이 파일 이름을 저장할 때 "CP437"(Windows에서는 "MS-DOS" 인코딩이라고도 함)이라는 인코딩 방법을 사용합니다. 이 인코딩 방법은 소수의 문자 세트만 지원하며 중국어 문자는 포함하지 않습니다. 이므로 Zip 압축 파일에 한자가 포함되어 있으면 문자가 깨져서 나타납니다.

이 문제를 해결하려면 파일을 압축할 때 파일 이름을 유니코드 인코딩에서 CP437 인코딩으로 변환해야 합니다. Golang은 UTF-8로 인코딩된 문자열을 GBK 인코딩으로 변환할 수 있는 내장 함수 golang.org/x/text/encoding/simplifiedchinese.GBK를 제공합니다. golang.org/x/text/encoding/simplifiedchinese.GBK,它可以将UTF-8编码的字符串转换为GBK编码。

下面是一个示例代码,可以在压缩文件时使用GBK编码:

package main

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

func main() {
    fmt.Println("Starting the application...")
    inputDir := "input_dir"
    outputFile := "output.zip"
    err := Zip(inputDir, outputFile)
    if err != nil {
        panic(err)
    }
    fmt.Println("Output file created successfully!")
}

// Zip function compress a folder to zip file
func Zip(source, target string) error {
    targetfile, err := os.Create(target)
    if err != nil {
        return err
    }
    defer targetfile.Close()

    zipWriter := zip.NewWriter(targetfile)
    defer zipWriter.Close()

    filepath.Walk(source, func(path string, info os.FileInfo, err error) error {
        if info.IsDir() {
            return nil
        }
        if err != nil {
            return err
        }

        filename := info.Name()
        gbkFilename, err := simplifiedchinese.GBK.NewEncoder().String(filename)
        if err != nil {
            return err
        }

        file, err := os.Open(path)
        if err != nil {
            return err
        }

        defer file.Close()

        zipfile, err := zipWriter.Create(gbkFilename)
        if err != nil {
            return err
        }

        _, err = io.Copy(zipfile, file)
        if err != nil {
            return err
        }
        return nil
    })

    return nil
}
로그인 후 복사

在上面的代码中,我们使用了filepath.Walk方法遍历文件夹中的所有文件,并使用GBK.NewEncoder().String()方法将文件名从UTF-8编码转换为GBK编码。然后,我们在zipWriter.Create

다음은 파일 압축 시 GBK 인코딩을 사용할 수 있는 샘플 코드입니다.

rrreee

위 코드에서는 filepath.Walk 메서드를 사용하여 폴더의 모든 파일을 반복하고 GBK.NewEncoder().String() 메서드는 파일 이름을 UTF-8 인코딩에서 GBK 인코딩으로 변환합니다. 그런 다음 변환된 파일 이름을 사용하여 zipWriter.Create 메서드에서 Zip 파일 항목을 생성합니다.

위 예제 코드에서는 중국어 간체 인코딩을 사용했습니다. 중국어 번체 인코딩이나 기타 인코딩 방법을 사용해야 하는 경우 해당 인코딩 방법을 수정하세요.

요약🎜🎜Golang에서 Zip 파일을 압축할 때 파일 이름이 왜곡되는 문제가 발생할 수 있습니다. 이 문제를 해결하려면 파일 이름을 유니코드 인코딩에서 파일 압축 시 Zip 파일에 사용되는 인코딩으로 변환해야 합니다. 위의 샘플 코드는 GBK 인코딩을 사용하여 Zip 파일 이름이 왜곡되는 문제를 해결하는 방법을 보여줍니다. 🎜

위 내용은 golang zip 잘못된 코드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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