文件编码格式

文章目录


前言

在进行代码开发,特别是有中文注释时,跨代码开发平台很容易遇到编码格式不统一的问题,导致注释乱码现象,对此简单学习了解一下相关的知识。


一、字符编码

计算机眼中,所有的信息都是二进制0和1组成的数字串,为了能让字符信息显示到屏幕上,就需要给每个字符一个数字编号,数字编号到字符之间的mapping必须是一对一的,mapping关系就叫字符集。有了映射关系还不够,必须要处理字符间的间隔关系,不能两个字符的数字编号连一起还能表示第三个字符,而最好的分隔方式就是规定每个字符对应的数字编号二进制长度相同,比如每8位/1字节表示一个字符。这些规则就形成了不同的文件编码格式。

二、文件编码格式

1.ASCII

ASCII,全称美国信息交换标准代码,是最早、最基础的编码标准之一,诞生于1960年代。它的定位非常明确:满足纯英文环境的需求。它的特点是字符集极小(26个英文字母的大小写、10个数字、一些基础的标点符号、33个控制字符如换行 回车 文件结束等),只有128个字符,每个字符严格占用1个字节(实际上只用到了前7位)。而局限性就是,无法表示任何非英文字符,如中文、日文、俄文等,随着计算机全球化发展,这就成了瓶颈。因为早,所以几乎能被后面所有的现代编码格式兼容,即ASCII范围内的字符在其他编码格式中保持相同的二进制(所以我们写的代码或英文注释并不会乱码)。

 2.ASCII扩展——ISO-8859系列、ANSI等

为了突破ASCII的限制,各个国家和地区在ASCII的基础上进行了扩展,产生了如ISO-8859系列、ANSI等编码格式,这两个都不是具体的编码格式,是一类格式的统称

ISO-8859系列用的不多,相比之下ANSI使用的就比较广泛了。ANSI是指当前Windows系统默认的区域设置所对应的那个单字节扩展ASCII编码,如果你的Windows系统区域设置是中文(简体,中国),那么保存时选择 ANSI,文件实际使用的编码就是GBK(CP936)。其他地区的具体文件编码还包括:Big5(CP950) 用于繁体中文、Shift_JIS(CP932)用于日文、EUC-KR(CP949)用于韩文等等。这种编码的局限显而易见:跨地区阻碍、表示容量不足且互不兼容。实际上上述以及大部分地区编码都是双字节编码以上,已经超出单字节拓展ASCII编码这个定义,ANSI现在更宽泛地指代系统默认的非Unicode编码,比如GB2312、GBK、GB18030这些,说属于ANSI编码大类吧?既对也错,所以现在我们都直接称具体的编码格式,很少提到ANSI了。

2.1 ISO-8859-1

ISO-8859稍微广泛的就是ISO-8859-1 (Latin-1)编码格式了,它也只是作为Mysql数据库表的默认编码方式,在ASCII基础上充分利用第8位,能表示256个字符,也是单字节编码,为什么Mysql使用该编码格式而不是后面介绍的UTF8,首先公司是瑞典公司,这个编码覆盖西欧语言(法语、德语、西班牙语等),其次是能更好的兼容——单字节编码优势使得把其他任何格式都能存下去,无非显示乱码,但二进制数据值是正确的

2.2 ANSI-GBx中文编码

中文编码格式GB2312、GBK、GB18030等。这个肯定是我们用的最广泛的了,GB的含义即guobiao国标。GB2312是最早版本,双字节编码,收录了6763个汉字和682个特殊符号,这些符号也包含了部分之前的ASCII编码,所以就诞生了半角(源自西文字符ASCII字符集)和全角(为兼容东亚文字而设计的扩展形式)的概念,中文输入法符号标点默认全角,英文输入法符号标点默认半角,编程就需要严格半角了。GBK(K即kuo扩展)是GB2312的拓展,双字节编码,汉字达到了20902个,里面还包含了繁体字,但是繁体字和Big5不太兼容还是得区分开。GB18030是GBK的拓展,四字节编码,中国文化博大精深,两万多字符集也不够用了,此时汉字编码标准不仅包括汉族汉字,也加入了少数民族的文字。实际上GBK最广泛,扩展多但是都是扩展的不常见的,常见的前面都囊括了。

3.Unicode

 Unicode联盟制定的标准,目标非常宏大:为世界上所有语言的所有字符提供一个唯一的、统一的编码方案,它定义了一个庞大的字符集,为每个字符分配一个唯一的编号。 Unicode同样,本身不直接规定字符在文件或内存中如何存储为二进制字节流,它只定义字符到数字(码点)的映射关系。Unicode方案的具体编码方式包括三种实现:UTF-8(1~4变长字节编码)、UTF-16(2字节编码)、UTF-32(4字节编码)。后两个用的不多,个别地方有优势,但是存在字节序问题,用得最广泛的就是UTF-8了。

3.1 UTF-8/UTF-8 with BOM

UTF-8我想是世界上用的最广泛的编码格式了,因为统一性,适用任何国家地区、操作系统设备。UTF-8如何识别字节数?二进制数中最高连续1的个数决定字符间的分隔方式:0开头单字节,ASCII字符重合;11开头双字节,拉丁字母扩展、希腊文、西里尔文等;111开头三字节,大部分常用汉字、其它多国文字;1111开头四字节,生僻字、历史文字、emoji等。注意上述开头指字符首字节的开头,不属于字符首字节的字节都以10开头。

对于汉字编码,GBK两字节,UTF-8三字节,所以Windows中文系统下有些环境的默认编码格式GBK更节省空间,而从编码方式看ANSI和Unicode一点关系没有,除了兼容ASCII,所以很容易出现乱码。而我们常见的UTF-8和UTF-8 with BOM又是什么意思呢?BOM是字节顺序标记,其实在UTF-16/32中用的比较多,UTF-8中使用是签名的意思,会在文件的最开头添加三个特殊的字节EF BB BF明确表示是UTF-8编码的,其他就没啥用了,甚至有副作用:浪费空间且带来兼容性问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值