亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

[golang]一個復雜的中文編碼問題

標簽:
Go

今天在网上遇到一个问题,觉得挺有意思,就帮人解答了。

需求

在编码为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位的容器,ISO-8859-1编码是一个8位的容器。

首先说一下处理编码问题的原则:保证写和读都使用同一套规则

依照这个原则处于中间环节的数据库不支持中文的问题怎么处理,要先看对方系统怎么读数据:
将Latin1编码的字符串转码为GBK后作为短信内容
那么我们任务就是:
将短信内容以GBK编码强制转码为ISO-8859-1然后存入数据库
清楚了任务,后面就是实现了。

  1. UTF8->GBK,Golang是UTF8编码的,那么首先转码GBK。这里需要注意的一点是不能用Encoder.String()方法,因为这样会强制将已经编码的GBK字节流用Golang内置的UTF8 Decoder解码,而这样得到的乱码string将无法还原回原本的GBK字节流。

  2. GBK字节流强制转ISO-8859-1字节流,怎么做呢?就是什么都不做。。。

  3. ISO-8859-1字节流->UTF8 string,我不是很确定如何在SQL中提交[]byte,那么一个保守的做法就是先将ISO-8859-1转码为UTF8,然后由数据库驱动将UTF8转回ISO-8859-1提交。

还有一点可以提一下,由于ISO-8859-1不支持中文,所以直接提交UTF8中文,数据库驱动会直接将中文替换为?。



作者:一桶冷水
链接:https://www.jianshu.com/p/fa3ca8148d79

點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消