今天在网上遇到一个问题,觉得挺有意思,就帮人解答了。
需求
在编码为Latin1的MySQL数据库中插入中文数据,由另一个系统将Latin1编码的字符串转码为GBK后作为短信内容发出。
简单版解答
import (
"golang.org/x/text/encoding/charmap"
"golang.org/x/text/encoding/simplifiedchinese"
)
func Convert(src string) (string, error) {
gbk, err := simplifiedchinese.GBK.NewEncoder().Bytes([]byte(src))
if err != nil {
return "", err
}
latin1, err := charmap.ISO8859_1.NewDecoder().Bytes(gbk)
if err != nil {
return "", err
}
return string(latin1), nil
}
解析
Latin1即ISO-8859-1,抄一段介绍 ,详见百度百科
因为ISO-8859-1编码范围使用了单字节内的所有空间,在支持ISO-8859-1的系统中传输和存储其他任何编码的字节流都不会被抛弃。换言之,把其他任何编码的字节流当作ISO-8859-1编码看待都没有问题。这是个很重要的特性,MySQL数据库默认编码是Latin1就是利用了这个特性。ASCII编码是一个7位的容