問題描述:
需要調取乙個第三方的介面,介面返回的內容的編碼格式是gbk的,但是golang內建只認utf8,所以需要將gbk的字串轉換為utf8,才能進行後續的資料處理。
問題處理:
引入開源包 go get github.com/axgle/mahonia
此包的開源協議是bsd,所以可以放心的引用和使用
mahonia原始碼解讀:
// convertstring converts a string from d's encoding to utf-8.
func (d decoder) convertstring(s string) string
if status == no_room
bytes = bytes[size:]
runes[destpos] = c
destpos++
}return
string(runes[:destpos])
}
本以為呼叫上面這個函式就可以完成轉換,結果發現返回的字串的中文部分依舊是亂碼。網上查閱資料後,發現還需要呼叫乙個translate函式。
// translate enables a decoder to implement go-charset's translator inte***ce.
func (d decoder) translate(data byte, eof bool) (n int, cdata byte, err error)
rune =0xfffd
n = len(data)
default:
n += size}if
rune
<128
cdata[destpos] = byte(rune)
destpos++
} else
destpos += utf8.encoderune(cdata[destpos:], rune)}}
return n, cdata[:destpos], nil
}
內部的編碼轉換**就不分析了,看了下沒怎麼看明白。。。就當一回拿來主義,看一下函式的入參和返回值,直接呼叫了。發現返回值有三個引數,n應該是字串的容量或者長度,err我發現不管怎樣都是返回nil,所以這兩個引數對我來說我並不關心,只需要拿到第二個返回引數byte就行了。
於是,封裝成轉換函式如下
//src為要轉換的字串,srccode為待轉換的編碼格式,targetcode為要轉換的編碼格式
func converttobyte(src string, srccode string, targetcode string) byte
使用
response = util.converttobyte(string(response), "gbk", "utf8")
err = json.unmarshal(response, &result)
iferr != nil
return result,nil
大功告成 php字串編碼轉換
使用舉例 1 把 gbk 編碼字串轉換成 utf 8 編碼字串 view plaincopy toclipboardprint?header content type text html charset utf 8 echomb convert encoding 你是我的好朋友 utf 8 gbk ...
java 字串編碼轉換
public class changecharset 將字元編碼轉換成iso 8859 1碼 public static string toiso 8859 1 string str throws unsupportedencodingexception 將字元編碼轉換成utf 8碼 public ...
icu 字串編碼探測及字串編碼轉換例項
編譯 g o x x.cpp licuuc licui18n 請大家確認是否安裝icu庫 include include include include include define buf max 4096 data,傳入引數,需要探測的字串 len,傳入引數,探測字串長度 detected 傳出...