Golang 与 PHP 的 json 序列化问题
Intro 最近在做 Golang 与 PHP 的 RPC 实现。因 PHP 业务端已上线稳定,Golang 方面则需要完全兼容。其中使用了 json 序列化,发现区别还是很大的,见下面代码。 $ php -a php > echo json_encode("<test我爱中国>"); "<test\u6211\u7231\u4e2d\u56fd>" package main import ( "encoding/json" "fmt" ) func main() { st := "<test我爱中国>" res, err := json.Marshal(st) if err != nil { fmt.Println("json err:", err.Error()) } fmt.Printf("json is: %s", string(res)) // json is: "\u003ctest我爱中国\u003e" } PHP 默认的 json_encode() 函数会把多字节字符转成 \uXXXX 当然通过设置 JSON_UNESCAPED_UNICODE 可以解决这个问题。这里不动 PHP 代码。 Golang 这里用 json 包的 Marshal 方法实现序列化,对多字节字符是不进行处理的。但是这个方法出于安全考虑会将"<", “>”, “&“这三个字符转成 \uXXXX 形式。这还不是最魔幻的,这个方法没有可选参数进行设置。 ...