funcGbkToUtf8(s []byte)([]byte,error){//第二个参数为“transform.Transformer”接口,simplifiedchinese.GBK.NewDecoder()包含了该接口
reader := transform.NewReader(bytes.NewReader(s), simplifiedchinese.GBK.NewDecoder())
d, e := ioutil.ReadAll(reader)if e !=nil{returnnil, e
}return d,nil}funcUtf8ToGbk(s []byte)([]byte,error){
reader := transform.NewReader(bytes.NewReader(s), simplifiedchinese.GBK.NewEncoder())
d, e := ioutil.ReadAll(reader)if e !=nil{returnnil, e
}return d,nil}
编码转换(Charset)
package charset
import("bytes""errors""fmt""io/ioutil""golang.org/x/text/encoding""golang.org/x/text/encoding/ianaindex""golang.org/x/text/transform")type Charset string//中文const(
GBK Charset ="GBK"
GB18030 ="GB18030"
GB2312 ="GB2312"
Big5 ="Big5")//日文const(
EUCJP Charset ="EUCJP"
ISO2022JP ="ISO2022JP"
ShiftJIS ="ShiftJIS")//韩文const(
EUCKR Charset ="EUCKR")//Unicodeconst(
UTF_8 Charset ="UTF-8"
UTF_16 ="UTF-16"
UTF_16BE ="UTF-16BE"
UTF_16LE ="UTF-16LE")//其他编码const(
Macintosh Charset ="macintosh"
IBM ="IBM*"
Windows ="Windows*"
ISO ="ISO-*")var charsetAlias =map[string]string{"HZGB2312":"HZ-GB-2312","hzgb2312":"HZ-GB-2312","GB2312":"HZ-GB-2312","gb2312":"HZ-GB-2312",}funcConvert(dstCharset Charset, srcCharset Charset, src string)(dst string, err error){if dstCharset == srcCharset {return src,nil}
dst = src
// Converting <src> to UTF-8.if srcCharset !="UTF-8"{if e :=getEncoding(srcCharset); e !=nil{
tmp, err := ioutil.ReadAll(
transform.NewReader(bytes.NewReader([]byte(src)), e.NewDecoder()),)if err !=nil{return"", fmt.Errorf("%s to utf8 failed. %v", srcCharset, err)}
src =string(tmp)}else{return dst, errors.New(fmt.Sprintf("unsupport srcCharset: %s", srcCharset))}}// Do the converting from UTF-8 to <dstCharset>.if dstCharset !="UTF-8"{if e :=getEncoding(dstCharset); e !=nil{
tmp, err := ioutil.ReadAll(
transform.NewReader(bytes.NewReader([]byte(src)), e.NewEncoder()),)if err !=nil{return"", fmt.Errorf("utf to %s failed. %v", dstCharset, err)}
dst =string(tmp)}else{return dst, errors.New(fmt.Sprintf("unsupport dstCharset: %s", dstCharset))}}else{
dst = src
}return dst,nil}funcToUTF8(srcCharset Charset, src string)(dst string, err error){returnConvert("UTF-8", srcCharset, src)}funcUTF8To(dstCharset Charset, src string)(dst string, err error){returnConvert(dstCharset,"UTF-8", src)}funcgetEncoding(charset Charset) encoding.Encoding {if c, ok := charsetAlias[string(charset)]; ok {
charset =Charset(c)}if e, err := ianaindex.MIB.Encoding(string(charset)); err ==nil&& e !=nil{return e
}returnnil}
文章目录编码转换(Transform)编码转换(Charset)编码猜测编码转换(Transform)Utf8是golang的原生编码方式,Utf8=>X为编码,X=>Utf8为解码。字节是数据的最小单元,数据转换和传输都以字节切片的形式进行。$ go get golang.org/x/textfunc GbkToUtf8(s []byte) ([]byte, erro...