Title: zip 包解压乱码 · Issue #127 · codcodog/Blog · GitHub
Open Graph Title: zip 包解压乱码 · Issue #127 · codcodog/Blog
X Title: zip 包解压乱码 · Issue #127 · codcodog/Blog
Description: zip 包解压乱码 场景 使用 golang zip 包解压时,文件名含有中文会出现乱码. 原因 因为压缩包是在 windows 平台压缩的,压缩软件 winrar 会使用本地编码方式进行压缩,所以含有中文的文件名是 gbk 格式的, 而 golang 字符串是使用 utf-8 格式,从而出现乱码. 解决 通过标识位识别 gbk 编码,若是则转换为 utf-8 如果未设置通用位11,则文件名和注释使用原始的ZIP字符编码 如果设置了通用位11,则文件名和注释必须使用UT...
Open Graph Description: zip 包解压乱码 场景 使用 golang zip 包解压时,文件名含有中文会出现乱码. 原因 因为压缩包是在 windows 平台压缩的,压缩软件 winrar 会使用本地编码方式进行压缩,所以含有中文的文件名是 gbk 格式的, 而 golang 字符串是使用 utf-8 格式,从而出现乱码. 解决 通过标识位识别 gbk 编码,若是则转换为 utf-8 如果未设置通用位11,则文件名...
X Description: zip 包解压乱码 场景 使用 golang zip 包解压时,文件名含有中文会出现乱码. 原因 因为压缩包是在 windows 平台压缩的,压缩软件 winrar 会使用本地编码方式进行压缩,所以含有中文的文件名是 gbk 格式的, 而 golang 字符串是使用 utf-8 格式,从而出现乱码. 解决 通过标识位识别 gbk 编码,若是则转换为 utf-8 如果未设置通用位11,则文件名...
Opengraph URL: https://github.com/codcodog/Blog/issues/127
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"zip 包解压乱码","articleBody":"zip 包解压乱码\r\n==============\r\n\r\n### 场景\r\n\r\n使用 `golang` `zip` 包解压时,文件名含有中文会出现乱码.\r\n\r\n\r\n\r\n### 原因\r\n\r\n因为压缩包是在 `windows` 平台压缩的,压缩软件 `winrar` 会使用本地编码方式进行压缩,所以含有中文的文件名是 `gbk` 格式的, \r\n而 `golang` 字符串是使用 `utf-8` 格式,从而出现乱码.\r\n\r\n\r\n### 解决\r\n\r\n通过标识位识别 `gbk` 编码,若是则转换为 `utf-8`\r\n\u003e 如果未设置通用位11,则文件名和注释使用原始的ZIP字符编码 \r\n\u003e 如果设置了通用位11,则文件名和注释必须使用UTF-8存储规范定义的字符编码形式支持Unicode标准版本4.1.0或更高版本\r\n\r\n```golang\r\nfunc (tc *TaskController) unzip(fileName string, dst string) (map[string][]string, int, error) {\r\n\tzf, err := zip.OpenReader(fileName)\r\n\tif err != nil {\r\n\t\treturn nil, 0, err\r\n\t}\r\n\tdefer zf.Close()\r\n\r\n\ttotal := 0 // 总文件数,记录任务进度\r\n\tfiles := make(map[string][]string) // 文件信息缓存,sku =\u003e 文件名\r\n\tfor _, file := range zf.File {\r\n\t\t// 注意,windows 下的压缩文件是GBK,解压可能有中文名,则需要转换为 utf-8\r\n\t\tif file.Flags == 0 {\r\n\t\t\ti := bytes.NewReader([]byte(file.Name))\r\n\t\t\tdecoder := transform.NewReader(i, simplifiedchinese.GB18030.NewDecoder())\r\n\t\t\tcontent, _ := ioutil.ReadAll(decoder)\r\n\t\t\tfile.Name = string(content)\r\n\t\t}\r\n\r\n\t\tpath := filepath.Join(dst, file.Name)\r\n\t\tif file.FileInfo().IsDir() {\r\n\t\t\tcontinue\r\n\t\t}\r\n\r\n\t\tf, err := file.Open()\r\n\t\tif err != nil {\r\n\t\t\tlog.Error(\"[file.Open] error: %v\", err)\r\n\t\t\treturn nil, 0, err\r\n\t\t}\r\n\r\n\t\tif err = os.MkdirAll(filepath.Dir(path), os.ModePerm); err != nil {\r\n\t\t\tf.Close()\r\n\t\t\treturn nil, 0, err\r\n\t\t}\r\n\r\n\t\tfw, err := os.OpenFile(path, os.O_CREATE|os.O_RDWR|os.O_TRUNC, file.Mode())\r\n\t\tif err != nil {\r\n\t\t\tlog.Error(\"[os.OpenFile] error: %v\", err)\r\n\t\t\treturn nil, 0, err\r\n\t\t}\r\n\t\t_, err = io.Copy(fw, f)\r\n\t\tif err != nil {\r\n\t\t\tf.Close()\r\n\t\t\tfw.Close()\r\n\t\t\treturn nil, 0, err\r\n\t\t}\r\n\r\n\t\tf.Close()\r\n\t\tfw.Close()\r\n\r\n\t\tsku := tc.getSku(file.Name)\r\n\t\tif sku == \"\" {\r\n\t\t\tcontinue\r\n\t\t}\r\n\t\tfiles[sku] = append(files[sku], file.Name)\r\n\t\ttotal += 1\r\n\t}\r\n\r\n\treturn files, total, nil\r\n}\r\n```\r\n\r\n### 参考\r\n[go 处理zip解压时乱码问题](https://studygolang.com/articles/21345) \r\n[Creating a zip archive with Unicode filenames using Go's archive/zip](https://stackoverflow.com/questions/30026083/creating-a-zip-archive-with-unicode-filenames-using-gos-archive-zip)\r\n","author":{"url":"https://github.com/codcodog","@type":"Person","name":"codcodog"},"datePublished":"2021-04-25T15:34:45.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":0},"url":"https://github.com/127/Blog/issues/127"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:4863e8bf-1e1e-a2eb-ee94-8e10efc66181 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | E8A2:37D99:F39C20:14F62D9:6A4CA193 |
| html-safe-nonce | ea5b03d79a2e5ff6e03c14fb006f192ddab611c61fdd74226a40e3a174aacb59 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJFOEEyOjM3RDk5OkYzOUMyMDoxNEY2MkQ5OjZBNENBMTkzIiwidmlzaXRvcl9pZCI6IjI0NjQ3NzU5NjA3OTgyMDg0MDMiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ== |
| visitor-hmac | 6172040fe339ae7596aa14bd613f6b636cef515237b6701ff86e2d22dfd7acb3 |
| hovercard-subject-tag | issue:867040790 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/codcodog/Blog/127/issue_layout |
| twitter:image | https://opengraph.githubassets.com/7f9cc8865ef495f4afc3e8cb349c5a9a49364be615ebc4618f0ec4cb71ebbd1a/codcodog/Blog/issues/127 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/7f9cc8865ef495f4afc3e8cb349c5a9a49364be615ebc4618f0ec4cb71ebbd1a/codcodog/Blog/issues/127 |
| og:image:alt | zip 包解压乱码 场景 使用 golang zip 包解压时,文件名含有中文会出现乱码. 原因 因为压缩包是在 windows 平台压缩的,压缩软件 winrar 会使用本地编码方式进行压缩,所以含有中文的文件名是 gbk 格式的, 而 golang 字符串是使用 utf-8 格式,从而出现乱码. 解决 通过标识位识别 gbk 编码,若是则转换为 utf-8 如果未设置通用位11,则文件名... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | codcodog |
| hostname | github.com |
| expected-hostname | github.com |
| None | 3d11bb817438277de2a940854450e83a7d32b6aeb5014e9e6b00a6423900251c |
| turbo-cache-control | no-preview |
| go-import | github.com/codcodog/Blog git https://github.com/codcodog/Blog.git |
| octolytics-dimension-user_id | 18098145 |
| octolytics-dimension-user_login | codcodog |
| octolytics-dimension-repository_id | 75478736 |
| octolytics-dimension-repository_nwo | codcodog/Blog |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 75478736 |
| octolytics-dimension-repository_network_root_nwo | codcodog/Blog |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | ae90d426644ca15e89bacceb72e51f4e9dbf85f7 |
| ui-target | canary-1 |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width