linux字符编码相关知识总结、file命令、iconv命令
Introduction
现代计算机存储文件有很多种编码方式,各个计算机系统、程序支持的编码格式不尽相同。
基本概念
字符集
- 字符集指字符的集合,不同的字符集支持不同的语言,ASCII字符集就只支持英文。
- 字符集有对应码表,用来查找字符和做编码转换等;不表示最终编码方式。
字符编码
- 字符编码是指将字符集和二进制数建立映射的过程。
- 字符集和字符编码独立,大部分字符集对应唯一的编码方式,因此字符集名称可以一定程度上代表编码方式。
- Unicode字符集有多种编码方式:UTF-8、UTF-32、UTF-16等。
常见的字符集和编码方式
ASCII
- ASCII是字符集名称,同时也是字符编码方式,因为其编码方式唯一。
- 编码方式:略。
- 美国人发明了计算机,因此ASCII只支持英文,可以表示128个字符。
ISO-8859-x系列
- 字符集名称,同时也是编码方式。
- 为欧洲人设计,由于欧洲语言复杂性,分为了ISO-8859-1、ISO-8859-2等子标准。
- 向下兼容ASCII,即所有ASCII字符在ISO-8895-x中不改变原有编码方式。
ANSI系列
- ANSI不是字符集或者字符编码方式,而是一堆字符集及其编码方式的统称,包括*GB2312、中国*BIG5、日本Shift JIS等。
- 它指定了一种字符集的规范,而不是具体的字符集。双字节,并且向下兼容ASCII。
GBxxxx系列
- 字符集名称,同时也是编码方式。ANSI系列之一。
- 为中国人设计,采用双字节编码,兼容ASCII。
GB2312
最早的汉字编码方式。
GBK
兼容GB2312,覆盖了中国*的BIG5字符集以及Unicode中的CJK汉字。
GB18030
兼容GBK,并且覆盖了少数名族语言,采用单字节、双字节、四字节编码方式。
Unicode系列
如前所述,各个地区、各个语言有不同的编码方式,这为交流带来了障碍。于是ISO组织和统一码联盟推出了UCS和Unicode字符集,后来整合,字符集和编码方式基本一致。此处统称Unicode,Unicode字符集包含了世界上几乎所有语言,是目前使用最多的编码方式。
Unicode码表是四字节编码的。
Unicode向下兼容ASCII字符集,但是由于Unicode编码位数较多,如果使用单一的Unicode编码(UTF-32)来对ASCII字符集中的字符编码,会显得很浪费,于是出现了通用转换格式UTF-x系列编码方式。
UTF-8
Unicode字符集的一种编码方式。最低可以使用单字节编码,很容易兼容ASCII。
UTF-16
Unicode字符集的一种编码方式。最低可以使用双字节编码。
UTF-32
标准的Unicode字符集四字节编码方式。
UTF-x系列缺点
UTF-8采用边长字节编码,占用存储空间小,但是计算机处理较为复杂、效率低下。因此一种可行的做法是存储、传输时采用UTF-8编码,而需要对文本进行处理时转为UTF-16或UTF-32等相对稳定的编码方式。
Linux下查看、修改文件编码方式
查看
使用命令:file filenames
,即可查看文件的编码等信息,但是不一定准确,因为文件本身并不携带自身编码信息。
修改
使用iconv
命令即可达到目的。
iconv命令的常用选项
-
-f encoding
必选,指定源编码方式。
-
-t encoding
必选,指定目标编码方式。
-
-o filename
可选,指定输出文件,默认输出到标准输出。
-
-l
可选,输出支持的编码方式。
Reference
https://dailc.github.io/2017/05/03/char_charset_charEncoding.html
https://zhuanlan.zhihu.com/p/51202412
https://juejin.im/post/5a4aeae96fb9a04512394e12