根据几个最佳实践文档,检查输入数据是否为UTF-8是一个好主意。
在我的项目中,我使用Gin和go-playground/validator进行验证。有一个“ascii”验证器,但没有“utf-8”验证器。
我找到了https://pkg.go.dev/unicode/utf8#ValidString,我想知道用它来检查输入是否有帮助,因为Go本身在内部使用Unicode?
下面是一个例子:
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
type User struct {
Name string `json:"name" binding:"required,alphanum"`
}
func main() {
r := gin.Default()
r.POST("/user", createUserHandler)
r.Run()
}
func createUserHandler(c *gin.Context) {
var newUser User
err := c.ShouldBindJSON(&newUser)
if err != nil {
c.AbortWithError(http.StatusBadRequest, err)
return
}
c.Status(http.StatusCreated)
}
是否确保在调用c.ShouldBindJson后,newUser
中的名称是UTF-8编码的?使用utf8.ValidString检查name
是否有任何优势?
1条答案
按热度按时间kr98yfug1#
Gin使用标准的encoding/json包来解组JSON文档。该包的文档如下:
在对带引号的字符串进行解封时,无效的UTF-8或无效的UTF-16代理项对不会被视为错误。相反,它们会被Unicode替换字符U+FFFD替换。
确保解码的字符串值是有效的UTF-8。使用utf8.ValidString检查字符串值没有任何优势。
根据应用程序的要求,您可能需要检查并处理Unicode替换字符“�"。正如这个答案中的所展示的,SO像处理任何其他字符一样处理Unicode替换字符。
Go本身在内部使用Unicode?
一些语言特性使用UTF-8编码(字符串上的范围,[]rune和字符串之间的转换),但这些特性不限制可以存储在字符串中的字节。字符串可以包含任何字节序列,包括无效的UTF-8。