>  기사  >  백엔드 개발  >  golang zip에서 중국어 왜곡 코드를 해결하는 방법

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

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼원래의
2019-12-10 10:36:534080검색

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

Question

go 언어와 함께 제공되는 zip 패키지 zip 파일의 압축을 풀 수 있습니다. 그러나 winrar를 사용하여 zip으로 압축하면. go를 사용하여 다시 압축을 풀면 파일 이름이 깨졌음을 알 수 있습니다. 하지만 국내의 수많은 압축소프트웨어를 이용해 압축하고 압축을 풀어보면 깨지지 않습니다.

Cause

winrar를 압축할 때 압축에는 기본적으로 로컬 인코딩 방법이 사용됩니다. 중국에서는 로컬 인코딩 방식이 일반적으로 GBK입니다. 그리고 Go 언어 문자열은 UTF-8 형식이므로 잘못된 문자가 나타날 수 있다는 것을 알고 있습니다.

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

Solution

파일 이름 인코딩 방법을 결정하고 GBK인 경우 변환합니다. GBK=》utf-8

위 그림에서 플래그 필드의 11비트가 1이면 utf-8 인코딩이고 0이 로컬 인코딩임을 알 수 있습니다.

Code

다음 두 패키지가 코드에 사용됩니다:

"golang.org/x/ text/encoding/simplifiedchinese"

"golang.org/x/text/transform"

func Unzip(zipFile string, destDir string) error {
    zipReader, err := zip.OpenReader(zipFile)
    if err != nil {
        return err
    }
    defer zipReader.Close()
    var decodeName string
    for _, f := range zipReader.File {
        if f.Flags == 0{
            //如果标致位是0  则是默认的本地编码   默认为gbk
            i:= bytes.NewReader([]byte(f.Name))
            decoder := transform.NewReader(i, simplifiedchinese.GB18030.NewDecoder())
            content,_:= ioutil.ReadAll(decoder)
            decodeName = string(content)
        }else{
            //如果标志为是 1 << 11也就是 2048  则是utf-8编码
            decodeName = f.Name
        }
        fpath := filepath.Join(destDir, decodeName)
        if f.FileInfo().IsDir() {
            os.MkdirAll(fpath, os.ModePerm)
        } else {
            if err = os.MkdirAll(filepath.Dir(fpath), os.ModePerm); err != nil {
                return err
            }
            inFile, err := f.Open()
            if err != nil {
                return err
            }
            defer inFile.Close()
            outFile, err := os.OpenFile(fpath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
            if err != nil {
                return err
            }
            defer outFile.Close()
            _, err = io.Copy(outFile, inFile)
            if err != nil {
                return err
            }
        }
    }
    return nil
}

PHP 중국어 웹사이트에는 무료가 많이 있습니다 Golang 입문 튜토리얼# 🎜🎜#, 누구든지 배울 수 있습니다!

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.