根据几个最佳实践文档,最好判断输入数据是否为UTF-8.

在我的项目中,我使用Gin进行验证,因此使用Go-Platform/验证器进行验证.有一个"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有什么好处吗?

推荐答案

GIN使用标准的encoding/json包来解组JSON文档.documentation for that package says:

解组带引号的字符串时,无效的UTF-8或无效的UTF-16代理项对不会被视为错误.相反,它们被替换为Unicode替换字符U+FFFD.

确保解码的字符串值是有效的UTF-8.使用utf8.ValidString判断字符串值没有好处.

根据应用程序的要求,您可能需要判断和处理UNICODE替换字符"�".旁白:正如此答案中的�所演示的,因此可以像处理任何其他字符一样处理unicode替换字符.

围棋本身在内部使用Unicode吗?

一些语言功能使用UTF-8编码(字符串范围、[]符文和字符串之间的转换),但这些功能不限制可以存储在字符串中的字节数.字符串可以包含任何字节序列,包括无效的UTF-8.

Go相关问答推荐

区分Terminal和Hook Zerolog Go中的错误级别日志(log)输出

Go:嵌入类型不能是类型参数""

Go Fiber和HTMX—HX—Trigger header被更改为HX—Trigger,这不是HTMX监听的内容

如何使用工作区方法扩展克隆的Golang库

由docker中的nginx提供的样式和图像在页面上不起作用

一次打印用户输入的字符串n次

使用 Golang 获取目录磁盘使用情况

如何在 `hashicorp / terraform-exec` 中将 `ApplyConfig` 传递给 `tf.Apply()`?

在密钥不存在时处理 PATCH 部分更新

使用图像解码 JPEG 时 colored颜色 不正确.解码并写入 PDF?

Wire google Inject with multi return from provider 函数

如何在时间范围内规范化数组的元素?

golang pic.ShowImage 为什么它不生成图像而是向我发送base64值

未定义 protoc protoc-gen-go 时间戳

io.Pipe 使用困难

Golang BigInt 部门

使用 oklog/run 来自 Go 编译器的错误(无值)用作值

Terraform 自定义提供程序 - 数据源架构

具有多个嵌入式 struct 的 Go MarshalJSON 行为

处理程序中的无限循环