背景介绍:
golang实现的后端服务器有一个功能:gong用户数据上传,用户通过zip包将数据上传到服务器中,服务端需将该zip包进行解压,用于后续服务使用,后续使用的时候,发现解压出来的中文文件名未正确显示,本着有问题就解决的模板,现将整个解题过程记录如下。
猜测方向:
后端服务实现由golang完成,服务以容器的形式进行部署,那么出现问题的可能性就有两种,要么是golang解压过程不识别中文,要么是容器不识别中文。
1. 解压程序未转义编码格式, 搜索一下就知道golang是如何处理字符集的,不过多说
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
}
将解压的文件名通过日志打印出来,可以看到中文字符程序是解析出来了,那么就往下一个场景去考虑
2. 容器未支持中文字符
在宿主机创建一个中文名的文件,并拷贝到容器内部,查看文件,发现文件名乱码,问题原因查找出来了,
kubectl cp 第三方.cp {namespace}/{pod}-76849d74b5-bp25p:/home
怎么解决容器中文乱码的问题网上很多,我这边只是在制作镜像时添加环境变量:
通过locale查看当前环境的编码格式:
默认的POSIX格式不支持中文
locale -a:查看当前容器支持的格式
总共三种格式,只有C.UTF-8支持中文,Dockerfile中配置如下即可:
ENV LANG="C.UTF-8"
如果想用zh_CN.UTF-8等其他编码格式,需要额外安装,本文不深入讨论
最终效果图如下:
整个功能是实现了,但这潜藏着巨多的安全隐患,感兴趣的可以搜索:zip bomb, 目录穿越。