背景介绍:

golang实现的后端服务器有一个功能:gong用户数据上传,用户通过zip包将数据上传到服务器中,服务端需将该zip包进行解压,用于后续服务使用,后续使用的时候,发现解压出来的中文文件名未正确显示,本着有问题就解决的模板,现将整个解题过程记录如下。

image.png

猜测方向:

后端服务实现由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
}

将解压的文件名通过日志打印出来,可以看到中文字符程序是解析出来了,那么就往下一个场景去考虑

image.png

2. 容器未支持中文字符

在宿主机创建一个中文名的文件,并拷贝到容器内部,查看文件,发现文件名乱码,问题原因查找出来了,

kubectl cp 第三方.cp {namespace}/{pod}-76849d74b5-bp25p:/home

image.png

怎么解决容器中文乱码的问题网上很多,我这边只是在制作镜像时添加环境变量:

通过locale查看当前环境的编码格式:

image.png

默认的POSIX格式不支持中文

locale -a:查看当前容器支持的格式

image.png

总共三种格式,只有C.UTF-8支持中文,Dockerfile中配置如下即可:

ENV LANG="C.UTF-8"

如果想用zh_CN.UTF-8等其他编码格式,需要额外安装,本文不深入讨论

最终效果图如下:

image.png

整个功能是实现了,但这潜藏着巨多的安全隐患,感兴趣的可以搜索:zip bomb, 目录穿越。