Question
go 언어와 함께 제공되는 zip 패키지 zip 파일의 압축을 풀 수 있습니다. 그러나 winrar를 사용하여 zip으로 압축하면. go를 사용하여 다시 압축을 풀면 파일 이름이 깨졌음을 알 수 있습니다. 하지만 국내의 수많은 압축소프트웨어를 이용해 압축하고 압축을 풀어보면 깨지지 않습니다.
Cause
winrar를 압축할 때 압축에는 기본적으로 로컬 인코딩 방법이 사용됩니다. 중국에서는 로컬 인코딩 방식이 일반적으로 GBK입니다. 그리고 Go 언어 문자열은 UTF-8 형식이므로 잘못된 문자가 나타날 수 있다는 것을 알고 있습니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!