avatar

目录
文件编码、字符集,编码集,UTF-8,GBK等

文件编码

参考链接

参考链接1 -从字符编码的发展历史理解ANSI、GB2312、Unicode、UTF8和UTF16区别

参考链接2 -字符编码

参考链接2 -字符编码pdf版

参考链接3 区位码、国标码、机内码的区别和内在机制

[参考链接4 推荐阅读,总结的最好的一篇 关于字符编码,你所需要知道的]ASCII,Unicode,Ut

[参考链接4 pdf版

参考链接5 百度百科 ISO8859

参考链接6 编码的故事

参考链接7 MySQL UTF-8 使用请注意

文件编码总结

一直对于字符编码,编码集,utf-8,gbk,gb2312,iso8859,这样的概念搞得一脑袋懵,现在参考网上的一些知识,尝试下对它们做下总结。

字符编码

关于字符编码、子集码、字符集、现代编码模型的解释,可以查看参考链接

以我自己的理解来说

  • 字符编码 可以是指一个特定对象的编码,比如说三原色,把一种颜色称之为红,另外一种为绿,最一种为蓝。

  • 编码集字符集 , 不同的标准下编码的规则是不一致的,同一个标准下的编码单元集合就是一个字符集。计算机发展的早期,逐渐产生了ASCII(1963)EBCDIC(1964)。这里也说 字符编码编码集字符集的概念也可以认为是一种概念,不过方便理解我自己区分了一下。

  • 简单字符集,应该就是指上面的*ASCII(1963)EBCDIC(1964)*这两种字符编码时期的概念。

  • 现代编码模型,区别于简单字符集,由统一码通用字符集构成。字符编码的概念被分解为:

    1. 有哪些字符 (抽象字符表)
    2. 字符的编号 (编码字符集,引申出了编码空间,码位,码位值)
    3. 这些编号如何编码成一系列的“码元” (字符编码表)
    4. 如何组成八位字节流 (字符编码方案,将码元映射到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

查看文件编码格式

plaintext
1
2
3
4
5
6
7
8
file  文件名

或者

vim 文件

:set fileencoding

使用file命令查看文件的时候有时候会看到

1578990932276

4.txt中有数字字符,简体中文,繁体中文,非常令人迷惑!使用vim的时候可以看到是cp936。

sed -i ‘s/\r//’ filename

替换换行符的方式

mysql 的utf-8格式

mysql使用utf-8格式的时候一定要慎重,我们广为人知的utf-8格式在mysql中的名字是utf8mb4 ,这也是为了防止莫名其妙的乱码问题。

文章作者: thf
文章链接: http://pcbopcbo.github.io/2020/01/10/20200110/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 漂泊的个人笔记

评论