這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
今天讓官方文檔虐了幾條街。
需要能夠對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) // jsonhtml += "&#" + 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
的方法,並且該項不是null 指標,將會自動調用實現的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
。這個方法應該是我上面提供的升級版。
源碼很重要。
######參考文獻+ 【1】Package json - The Go Programming Language+ 【2】golang中文unicode編碼 - 豆蔻+ 【3】Package strconv - The Go Programming Language
原文連結:Golang——json資料處理,轉載請註明來源!