一、导入库 github.com/axgle/mahonia
二、使用方式
str :="我是中国人"
coderGbkToUtf8 := mahonia.NewDecoder("GBK") // GBK转成utf8编码
coderGbkToUtf8.ConvertString(str)
coderUtf8ToGbk := mahonia.NewEncoder("GBK") // utf8转成GBK编码
coderUtf8ToGbk.ConvertString(src)
三、判断字符串类型
1、判断是不是gbk
// 是不是gbk
func isGBK(str string) bool {
data := []byte(str)
dataLen := len(data)
var i int = 0
for i < dataLen {
if data[i] <= 0x7f {
//编码0~127,只有一个字节的编码,兼容ASCII码
i++
continue
} else {
if i+1 >= dataLen {
return false
}
//大于127的使用双字节编码,落在gbk编码范围内的字符
if data[i] >= 0x81 &&
data[i] <= 0xfe &&
data[i+1] >= 0x40 &&
data[i+1] <= 0xfe &&
data[i+1] != 0xf7 {
i += 2
continue
} else {
return false
}
}
}
return true
}
2、判断是不是Utf8 (没使用go自带的utf8判断,测试有些字符串判断有问题,如“系统”,“时装”,可能只是本人有问题)
// 是否utf8
func isUtf8(str string) bool {
i := 0
data := []byte(str)
dataLen := len(data)
for i < dataLen {
if (data[i] & 0x80) == 0x00 {
// 0XXX_XXXX
i++
continue
} else if num := preNUm(data[i]); num > 2 {
// 110X_XXXX 10XX_XXXX
// 1110_XXXX 10XX_XXXX 10XX_XXXX
// 1111_0XXX 10XX_XXXX 10XX_XXXX 10XX_XXXX
// 1111_10XX 10XX_XXXX 10XX_XXXX 10XX_XXXX 10XX_XXXX
// 1111_110X 10XX_XXXX 10XX_XXXX 10XX_XXXX 10XX_XXXX 10XX_XXXX
// preNUm() 返回首个字节的8个bits中首个0bit前面1bit的个数,该数量也是该字符所使用的字节数
i++
for j := 0; j < num-1; j++ {
//判断后面的 num - 1 个字节是不是都是10开头
if i >= dataLen {
return false
}
if (data[i] & 0xc0) != 0x80 {
return false
}
i++
}
} else {
//其他情况说明不是utf-8
return false
}
}
return true
}
func preNUm(data byte) int {
var mask byte = 0x80
var num int = 0
//8bit中首个0bit前有多少个1bits
for i := 0; i < 8; i++ {
if (data & mask) == mask {
num++
mask = mask >> 1
} else {
break
}
}
return num
}