func TransHtmlJson(data []byte) []byte {
data = bytes.Replace(data, []byte("\\u0026"), []byte("&"), -1)
data = bytes.Replace(data, []byte("\\u003c"), []byte("<"), -1)
data = bytes.Replace(data, []byte("\\u003e"), []byte(">"), -1)
return data
curl命令不会对\u0026转义
$ curl -s "http://127.0.0.1:8090/test"
["http://www.baidu.com?a=1\u0026b=2"]
浏览器json插件会转义
[ "http://www.baidu.com?a=1&b=2" ]
postman不会转义
["http://www.baidu.com?a=1\u0026b=2"]
若要在Marshal之后手动转义,必须Marshal一次,TransHtmlJson一次。
TransHtmlJson只适用于 \u0026 替换,不适用于 \\u0026 或 \\\u0026 等形式。
["http://www.baidu.com?a=1\u0026b=2"]
执行TransHtmlJson后得到 ["http://www.baidu.com?a=1&b=2"]
["[\"http://www.baidu.com?a=1\\u0026b=2\"]"]
执行TransHtmlJson后得到 ["[\"http://www.baidu.com?a=1\&b=2\"]"]
错误, &符号前面多了一个\
设置json序列化不转义func JSONMarshal(t interface{}) ([]byte, error) { buffer := &bytes.Buffer{} encoder := json.NewEncoder(buffer) encoder.SetEscapeHTML(false) err := encoder.Encode(t) return buff...
背景:goland后台使用json.Marshal转换时,会将<,>,&转化为unicode编码,导致入库时&变成\u0026。
原因: json.marshal默认escapeHtml为true,会将<、>、&等字符转义。
解决方案1:
import (
"bytes"
"encoding/json"
"fmt"
type MarshalTest struct {
Url string `json:"url"`
//序列化
func ma
转换为的unicode(为了直观,第一行后面加了个\):
\u007b\u0026\u0071\u0075\u006f\u0074\u003b \
\u0064\u0061\u0074\u0061\u0026\u0071\u0075\u006f\u0074\u003b\u003a\u007b
是不是发现了问题, unicode明显比原文多多了。 为什么呢?
下面来拆解下:
\u007b 对应符号 {
\u0026\u0071
最近在做一个项目(使用的beego框架),其中的一个接口有返回FS(分布式文件系统)的一个文件地址URL,其中含有一个&符号,但是通过beego返回的response中发现将其转义为了
“\u0026”,其原因是因为 beego 在对返回值进行 json.marshal 时会自动对特殊字符进行转义。
godoc文档,解释如下:
String values encode as JSON strings coerced to valid UTF-8, replacing invalid by.
最近在封装自定义json库,数据结构用自带的map,序列化接口调用了json.marshal去实现,发现&字符序列化之后变成了\u0026。
1、查阅了godoc文档,解释如下:
String values encode as JSON strings coerced to valid UTF-8, replacing invalid bytes with the Unicode repl...
Name string `json:"name"`
Result string `json:"result"`
Length string `json:"length"`
Ret string `json:"ret".
本篇文章的目的就是,不一定要把字符集的知识讲的有多深,但是一定要在工作上够用。
并且记得足够牢足够久。
工作中遇到的“词汇”,主要是ASCII、GB2312、GBK、Unicode、UTF-8,还有URL Encode、URL Escape。
编码和解码
编码,encode。
解码,decode。
编码,编成计算机能懂的码,二进制。
解码,解成人类能读懂的码,人语言。
想让计算机懂,你得编它。
想让人类能懂,你得解释。
字符代码和字符编码
这是一份阅读Go语言手册的读书笔记。Go语言中文手册可见Go中文手册。
Go是一种强类型化的语言,具有垃圾回收机制,并显式支持并发编程。 程序由包构造,以此来提供高效的依赖管理功能。当前实现使用传统的“编译-链接”模型来生成可执行的二进制文件。
注释与C++一致,有如下两种形式:
行注释 以// 开始,至行尾结束。一条行注释视为一个换行符。
块注释 以 /* 开始,至 */ 结束。 块注释在包含多行时视为一个换行符,否则视为一个空格。
注释不可嵌套。
标记构成Go语言的词汇,
在 golang 中,将字符串转换为 json 格式时,会自动将一些特殊字符添加反斜杠进行转义,如双引号、反斜杠、换行符等。这样做是为了避免这些特殊字符对 json 格式的解析产生干扰。
但有些时候,我们需要将这些转义字符去掉,得到原始的字符串内容。这时可以使用 strconv 包中的 Unquote() 函数。
Unquote() 函数会将字符串中表示转义字符的反斜杠去除,并将实际的字符转义为其对应的 ASCII 字符。如果字符串不是以双引号包裹的,则会返回一个错误。
示例代码如下:
package main
import (
"fmt"
"strconv"
func main() {
jsonStr := `{"name":"golang","version":"1.16"}`
fmt.Println(jsonStr)
unquotedStr, err := strconv.Unquote(jsonStr)
if err != nil {
fmt.Println(err)
return
fmt.Println(unquotedStr)
输出结果如下:
{"name":"golang","version":"1.16"}
{name:golang,version:1.16}
可以看到,经过 Unquote() 处理后,字符串中的双引号已经去掉了,而转义的字符也被正确还原。