公司内部使用的一个小工具,开始是C++写的,我在用go开发一个新的feature。
protobuf作为传输格式,在C++的client中log到的请求包信息是:
```
query: "南京到成都7月22日"
```
在golang实现的client中用 `fmt.Println(proto.MarshalTextString(req))` 打印的是:
```
query: "\345\215\227\344\272\254\345\210\260\346\210\220\351\203\2757\346\234\21022\346\227\245"
```
后台对C++请求的响应是正常的,对Go的响应则是出错,我没有后台的代码和调试权限,猜测是不是汉字编码的问题?
```
func main() {
str := "\345\215\227\344\272\254\345\210\260\346\210\220\351\203\2757\346\234\21022\346\227\245"
fmt.Println(str)
}
```
输出:
南京到成都7月22日
成功: 进程退出代码 0.
#1
更多评论
http://tool.chinaz.com/Tools/utf-8.aspx
我用这个工具转换是
```
南京到成都7月22日
```
貌似我们后台需要 utf-8 编码,不知道怎样才能在go中用utf8填充protobuf呢?
#2
go里面默认都是用utf8处理字符串的: https://golang.google.cn/ref/spec#String_literals
`The three-digit octal (\nnn) and two-digit hexadecimal (\xnn) escapes represent individual bytes of the resulting string; all other escapes represent the (possibly multi-byte) UTF-8 encoding of individual characters. Thus inside a string literal \377 and \xFF represent a single byte of value 0xFF=255, while ÿ, \u00FF, \U000000FF and \xc3\xbf represent the two bytes 0xc3 0xbf of the UTF-8 encoding of character U+00FF.`
package main
import (
"fmt"
)
func main() {
str := "你好a"
fmt.Printf("%x\n", []byte(str))
fmt.Println("\xe4\xbd\xa0\xe5\xa5\xbd\x61") //用十六进制表示utf8编码的每个字节
fmt.Printf("%o\n", []byte(str))
fmt.Println("\344\275\240\345\245\275\141") //用八进制表示utf8编码的每个字节
for _, r := range str {
fmt.Printf("%x,", r)
}
fmt.Println("")
fmt.Println("\u4f60\u597d\u0061") //用每个字符的unicode值表示这个字符串
}
#3