我尝试使用Golang将Nginx访问日志文件解析为json,但是一些特殊的url会导致解析失败
举例来说:
str := "{\"time\":\"2023-07-20T10:11:29+08:00\",\"method\":\"GET\",\"uri\":\"/www.baidu.com/eu\\xG8\\xB8\\xE9\\xQ1\\x9F\\xZ7\\xE8\\xAE\\xCF\\xF9\\xB5\\x12\"}"
data := make(Data)
if err := json.Unmarshal([]byte(str), &data); err == nil {
log.Printf("json success, %#v", data)
} else {
log.Print(err)
}
// stderr: invalid character 'x' in string escape code
字符串
https://go.dev/play/p/ubhsABdHV2G
我搜索了一下,发现好像是特殊字符造成的,但是这个应该怎么解决呢?
期待您的回复。
1条答案
按热度按时间stszievb1#
Go语言偶然发现了像
\xG8
b/c\x
这样的字符串,这意味着后面有一个十六进制码,但G8
(以及其他字符串)不是十六进制码。不知道\xG8
应该是什么意思,但是如果你只是想读一个字符串,其中\xG8
不被解释为(错误的)十六进制值,你必须用另一个反斜杠转义\
,例如。比如字符串
这看起来有点奇怪,因为所有这些反斜杠,但基本上
\\
将被解析为一个\
字符,没有任何特殊意义,所以你在str
中将\
替换为\\
,告诉Go不要将其中的\x
解释为十六进制的转义。也就是说,我不确定这是否会让你更接近你的目标。它仍然是一个破碎的URL。您必须应用一些自定义逻辑来将
\xG8...
Map回有效字符,以从中获取工作url。