字符编码问题:ANSI、ASCII、UNICODE、UTF8、GBK及其相互转换

在使用tesseract时,不可避免地会遇到各种字符编码问题。
各种ANSI、UNICODE、UTF8、GBK总是搞不清楚,制作训练样本时刚好借机了解了下字符编码相关问题,在此记录备忘。

首先介绍最熟悉的ascii码(American Standard Code for Information Interchange,美国信息互换标准代码):
使用8位二进制,0-127表示128个字符,其中前32个字符,0x00-0x20是控制码,其后便是空格、符号、字母、数字等常见字符。

ascii码对照表

因为当时美国只考虑到英语,并不涉及其他语言,而8为二进制最大可表示255,所以从128到255被用来保存一些表格竖线等特殊符号,这段字符集被称为”ascii码扩展字符集”

GBK(国标扩展):
ascii码显然只能满足英语或少数其他语言的需求,当有汉字时,通常一级汉字3700多个,二级汉字3000多个,ascii码便无能为力,只能通过其他方式来表示了。
于是有:继承ascii码的前128个字符,因为汉字中也常用,取消扩展字符集中那些诡异的符号,两个大于127的字符连在一起时,就表示一个汉字,这也就是一个汉字2个字节的原因,这样就能够表示绝大多数汉字了。不仅如此,在这种方式的编码里,数学符号、希腊字母、日文假名等也包含在内,对于ascii码中本来就有的数字、标点、字母等,也添加了占两个字节的编码,也就是中文中的”全角”字符,原来的叫”半角”字符。
这种汉字编码方式叫 “GB2312”。GB2312也就是中国人针对汉字编码的一种解决方案。
后来发展成为一种通用的标准–GBK,GBK向下兼容GB2312,同时也满足国际规范。

ANSI
ANSI是一种编码方式,是对ASCII码的扩展:用0x00~0x7f 范围的1 个字节来表示 1 个英文字符,超出一个字节的 0x80~0xFFFF 范围来表示其他语言的其他字符。
如上面的GB2312,ANSI编码相当于一种方式,而具体实现有很多种,且不同国家会不一样,如:中国的GB2312编码,日本的Shift_JIS,韩国的Euc-kr,各国有各国的标准。当时各国人只是考虑到自身情况,国际上也没有一个统一的标准,因为实现及编码内容各有不同,所以不同语言之间的ANSI码之间并不互通,不能相互转化,这就会导致在多语言混合的文本中会有乱码。

百度百科:不同的国家和地区制定了不同的标准,由此产生了 GB2312、GBK、GB18030、Big5、Shift_JIS
等各自的编码标准。这些使用多个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文Windows操作系统中,ANSI
编码代表 GBK 编码;在繁体中文Windows操作系统中,ANSI编码代表Big5;在日文Windows操作系统中,ANSI 编码代表
Shift_JIS 编码。 不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI
编码的文本中。 ANSI编码表示英文字符时用一个字节,表示中文用两个或四个字节。

UNICODE
如上面提到,不同国家ANSI编码标准并不统一,ISO(国际标谁化组织)提出了一个统一的标准: UCS,Universal Multiple-Octet Coded Character Set,也就是常说的UNICODE。对于全世界每一个符号都独立编码范围,不要所有的都使用同样的范围,那么就可以做到通用且不冲突。通常,是用两个字节表示一个字符(可能某些字符需要4个字节,UCS-4),即使是英文字母或数字,也是两个字节。所以造成了一定的空间浪费。

UTF8
UTF8是Unicode一种节省空间的实现形式,如字母A在unicode中表示为0x0041,而对于所有大小写字母、数字以及标点等,前面都是00的,而对于英文类文字,通常也只包含这些字符,所以避免空间浪费,utf8编码把英文压缩成1个字节。而与Unicode不同,对于中文字符,utf8占3个字节,所以UTF8是一种变长的编码方式。从unicode到uft-8要通过一定规则来转换。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值