在进行CRNN训练中文字体OCR时,楼主碰到了令人头疼的问题,中英文编码不同。
这边文章主要来讲一下“utf-8”与“gbk”的一些问题,有人或许会问不是还有一个unicode吗?看完下面一张图就知道啦。
unicode其实是一种在操作过程中存在的字符状态,一般来讲,例如python中的str都是以“unicode”编码,在进行操作时会具化成为“utf-8”与“gbk”,往往是前者居多。
如上图所示,在python中不同编码的转换都要经过Unicode,不论是UTF-8或者是GBK,整个过程都是先通过编码decode转换为Unicode告诉Unicode当前的编码格式是什么、然后再通过解码encode转换为自己想要实现的编码格式或类型。
看下下面的命令,会清楚很多。
s = '你好'
# str类型,默认编码为unicode
print(s.encode("gbk"))
# Unicode转gbk
# 输出为:b'\xc4\xe3\xba\xc3'
s = s.encode("gbk")
# 将gbk的s编码赋给s
print(s)
# 显然输出为: b'\xc4\xe3\xba\xc3'
print(len(s))
# 输出长度为 **4**
print(s.decode('gbk').encode("utf-8"))
# Unicode转utf-8
#输出为: b'\xe4\xbd\xa0\xe5\xa5\xbd'
#在这条语句中,由于先前s已经变成了gbk编码,所以得先解码变成unicode,再进行编码,否则报错
s = s.decode('gbk').encode("utf-8")
print(s)
#显然输出为: b'\xe4\xbd\xa0\xe5\xa5\xbd'
print(len(s))
# 输出长度为 **6**
那么“utf-8”与“gbk”两者区别是什么呢:
一、GBK是在国家标准GB2312基础上扩容后兼容GB2312的标准(好像还不是国家标准)。GBK编码专门用来解决中文编码的,是双字节的。不论中英文都是双字节的。GBK包含全部中文字符。
二、UTF-8 编码是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24位(三个字节)来编码。对于英文字符较多的论坛则用UTF-8 节省空间。另外,如果是外国人访问你的GBK网页,需要下载中文语言包支持。访问UTF-8编码的网页则不出现这问题。可以直接访问。UTF-8则包含全世界所有国家需要用到的字符。