文件编码
参考链接
参考链接1 -从字符编码的发展历史理解ANSI、GB2312、Unicode、UTF8和UTF16区别
[参考链接4 推荐阅读,总结的最好的一篇 关于字符编码,你所需要知道的]ASCII,Unicode,Ut
文件编码总结
一直对于字符编码,编码集,utf-8,gbk,gb2312,iso8859,这样的概念搞得一脑袋懵,现在参考网上的一些知识,尝试下对它们做下总结。
字符编码
关于字符编码、子集码、字符集、现代编码模型的解释,可以查看参考链接
以我自己的理解来说
字符编码 可以是指一个特定对象的编码,比如说三原色,把一种颜色称之为红,另外一种为绿,最一种为蓝。
编码集,字符集 , 不同的标准下编码的规则是不一致的,同一个标准下的编码单元集合就是一个字符集。计算机发展的早期,逐渐产生了ASCII(1963)和EBCDIC(1964)。这里也说 字符编码,编码集,字符集的概念也可以认为是一种概念,不过方便理解我自己区分了一下。
简单字符集,应该就是指上面的*ASCII(1963)和EBCDIC(1964)*这两种字符编码时期的概念。
现代编码模型,区别于简单字符集,由统一码和通用字符集构成。字符编码的概念被分解为:
- 有哪些字符 (抽象字符表)
- 字符的编号 (编码字符集,引申出了编码空间,码位,码位值)
- 这些编号如何编码成一系列的“码元” (字符编码表)
- 如何组成八位字节流 (字符编码方案,将码元映射到8位字节序列,以便编码后数据的存储等,Unicode需要一个字符指定大端序小端序,utf-8不需要,ISO/IEC 2022 使用控制字符转义序列)(传输编码语法)
字符集,代码页,字符映射
码元,已编码的文本中具有最短比特组合的单元,如utf-8是8比特长
代码页,通常意味着面向字节的编码,强调是一套用于不能语言的编码方案的集合,如”windows”代码页系列,“IBM/DOW代码页系列”
- Unix与linux不使用代码页系列
多字节字符集(MBCS)和中文字符集
理解了上面的概念,起码大概有一个印象(比如本人)接下来,可以查看参考链接4 的1.3章 参考链接
单字节字符集是对于英文来说的,甚至于说是拉丁语系都没有问题,256个字符已经足够用了。但是对于其他语种,比如说是中文,单字节字符集已经不够用了。多字节字符集是兼容***ASCII(1963)***的。
代码页,这里用到代码页的概念。
常用的中文字符集是GB2312、GBK,其中GB2312涵盖了所有的简体字符集和其他的字符,GBK(K代表扩展)加入了繁体字等,GB18030不常用到(本人没用过)
Windows系统採用936代码页来实现对GBK字符集的编解码。在解析字节流的时候,如果遇到字节的最高位是0的话,那么就使用936代码页中的第1张码錶进行解码,这就和单字节字符集的编解码方式一致了。
ANSI标準、国家标準、ISO标準
不同ASCII衍生字符集的出现,让文档交流变得非常困难,因此各种组织都陆续进行了标準化流程。例如美国ANSI组织制定了ANSI标準字符编码(注意,我们现在通常説到ANSI编码,通常指的是平台的默认编码,例如英文操作系统中是ISO-8859-1,中文系统是GBK),ISO组织制定的各种ISO标準字符编码,还有各国也会制定一些国家标準字符集,例如中国的GBK,GB2312和GB18030。
Unicode的出现
虽然通过使用不同字符集,我们可以在一台机器上查閲不同语言的文档,但是我们仍然无法解决一个问题:在一份文档中显示所有字符。为了解决这个问题,我们需要一个全人类达成共识的巨大的字符集,这就是Unicode字符集。
UTF-8应该是目前应用最广泛的一种Unicode编码方案。
文件编码格式的检测找不到一个可靠的工具,从上面的各个博客看来,各种兼容的历史问题导致的这一问题。
下面是遇到的一些编码的问题,应该都是从网上摘抄来的,备记一下,但是已经不记得出处了,抱歉抱歉。
linux的cp936
一直为GB2312,GBK,GB18030和CP936之间的关系头痛,今天得到Python群里一位高人指点,明白了cp936就是指系统里第936号编码格式,也就是GB2312。
vim设置读取不同编码格式的文件
在 ~/.vimrc 文件中加入下面这段内容
:set encoding=utf-8 fileencodings=ucs-bom,utf-8,cp936
设置别名,用来转换文件编码格式,参考使用
alias gbk2utf8=’iconv -f gbk -t utf-8’
查看支持的编码格式
iconv -l|grep UTF-8
查看文件编码格式
1 | file 文件名 |
使用file命令查看文件的时候有时候会看到
4.txt中有数字字符,简体中文,繁体中文,非常令人迷惑!使用vim的时候可以看到是cp936。
sed -i ‘s/\r//’ filename
替换换行符的方式
mysql 的utf-8格式
mysql使用utf-8格式的时候一定要慎重,我们广为人知的utf-8格式在mysql中的名字是utf8mb4 ,这也是为了防止莫名其妙的乱码问题。