前提
前端时间的公司的文件仓库类的项目,这两天发现有个问题,就是返回的结果中出现了相同路径的两条数据,仔细一看发现 path 中包含了乱码字符。问了别人才知道是他们程序中没有使用 utf-8 编码,创建路径的时候就出现了这个问题
那为什么同样的乱码字符能够插入两遍呢?因为是做了应用层面的唯一性校验,并且这些乱码字符插入到数据库之后又变成了其他的样子,只能全表查询到,指定匹配是匹配不到的
出现这个问题之后也是也是第一时间进行了处理,删除了那些乱码的数据,接着就是紧急修改这个问题了
正文
因为之前要求是上传路径要支持所有能支持的字符,所以就没有对 path 中的字符作限制。现在至少是要对上传的文件路径中包含乱码的进行限制了,具体如下:
go
package main
import (
"fmt"
"regexp"
)
func main() {
str := "Windows瀹夎鍖?"
// 定义一个正则表达式,用于匹配特定的字符
pattern := "[^\x20-\x7E\u4E00-\u9FA5]"
re := regexp.MustCompile(pattern)
// 使用正则表达式进行匹配
if re.MatchString(str) {
fmt.Println("存在中文乱码问题")
}
}
这个正则表达式 [^\x20-\x7E\u4E00-\u9FA5] 用于匹配不是 ASCII 字符、不是中文字符的特殊字符。这样应该就能支持正常的
结尾
现在在 golang 语言中,大部分的情况都是使用 utf-8 编码,所以很少出现编码的问题。正常的页面中上传时也是用的 utf-8 ,也不会出现什么问题。这次出现问题的就是在其他开发的一个 bat 脚本中使用了 GBK 编码引起的;所以之后的代码中一定还是要注意这方面的问题
还有就是不同的程序对编码的显示不一样, go 程序中可能是这样 Windows瀹夎鍖? ,但是到了 postgre 中,又会变成这样 Windows瀹夎鍖?/ ,所以要保持唯一性,最好还是在数据库层面进行设置