04 August 2014
关于Unicode的介绍和Golang的处理方法。

今天让官方文档虐了几条街。

需要能够对JSON数据进行编码,将内部的中文字符串转成Unicode编码。编码这种东西接触也不少了,随便搜一下就能解决。果断去搜了一下。本文所有编码

rs := []rune("golang中文unicode编码")
j := ""
html := ""
for _, r := range rs {
	rint := int(r)
	if rint < 128 {
		j += string(r)
		html += string(r)
	} else {
		j += "\\u" + strconv.FormatInt(int64(rint), 16) // json
		html += "&#" + strconv.Itoa(int(r)) + ";"       // 网页
	}
}
fmt.Printf("JSON: %s\n", j)
fmt.Printf("HTML: %s\n", html)

Golang里面,所有UTF8字符串里的单个字符,可以使用byte类型表示,经过[]byte(str)转换成数组之后,就能进行遍历获取。而对于Unicode,Golang提供了另一种数据类型rune,经过[]rune(str)转换之后,就能获取单个Unicode字符。对于英文字符以及英文标点,Unicode编码不变,而中文编码,转成16进制即可。

我们一般认为:UTF-16就是Unicode,以16位两字节为单位,最少为两字节,最多4个字节。

所以,一般情况下,转出的Unicode是4个16进制数字(2字节)组成。最后,为其追加\u头即可完成。

写完之后,就准备这么转了。结构体数据拼接完之后,把有中文的项单独编码一下。现在想想,硬编码太渣了。

看看官方文档的说法:

Marshal traverses the value v recursively. If an encountered value implements the Marshaler interface and is not a nil pointer, Marshal calls its MarshalJSON method to produce JSON. The nil pointer exception is not strictly necessary but mimics a similar, necessary exception in the behavior of UnmarshalJSON.

调用json.Marshal方法之后,会递归的访问传入的结构体的每个项,如果遍历到的项实现了Marshaler的方法,并且该项不是空指针,将会自动调用实现的MarshalJSON方法。

type QuoteString struct {
	QString string
}

func (q QuoteString) MarshalJSON() ([]byte, error) {
	return []byte(strconv.QuoteToASCII(q.QString)), nil
}

type ColorGroup struct {
	ID     int         `json:"id,string"`
	Name   QuoteString `json:"name"`
	Colors []string
}

上面定义了一个结构体QuoteString,它实现了Marshaler,所以会自动进行Unicode编码。转码,用了strconv包里的函数QuoteToASCII。这个方法应该是我上面提供的升级版。

源码很重要。


参考文献

原文链接:Golang——json数据处理,转载请注明来源!

EOF