UTF-8、GBK、GBK2312等字符编码的区别和vim乱码等相关问题研究。

转自本人博客:xge技术博客

http://www.xgezhang.com/char_encodind_vim.html

关于字符编码的问题在做项目的时候经常都会出现,但一直没有很系统的研究过,今天早上系统的看了几篇文章。在此整理分享以下。

三种编码方式的简介:

gb2312(又称为GB 2312-80)编码是一个简体中文字符集的中国国家标准,全称为《信息交换用汉字编码字符集·基本集》,又称为GB0,由中国国家标准总局发布,1981年5月1日实施。GB2312编码适用于汉字处理、汉字通信等系统之间的信息交换,通行于中国大陆;新加坡等地也采用此编码。中国大陆几乎所有的中文系统和国际化的软件都支持GB 2312。

基本集共收入汉字6763个和非汉字图形字符682个。每个字符使用2个字节表示。

gbk是汉字编码标准之一,全称《汉字内码扩展规范》(GBK即“国标”、“扩展”汉语拼音的第一个字母,英文名称:Chinese Internal Code Specification)

GBK编码产生的原因:由于GB2312-80只收录了6763个汉字,有不少汉字,如部分在GB 2312-80推出以后才简化的汉字(如“啰”),部分人名用字(如中国前总

理朱镕基的“镕”字),台湾及香港使用的繁体字,日语及朝鲜语汉字等,并未有收录在内。中文电脑开发商,于是利用了GB 2312-80未有使用的编码空

间,收录了所有出现在Unicode 1.1及GB 13000.1-93之中的汉字,制定了GBK编码。

在实际项目开发中,使用gb2312编码可能会使某些字符无法显示,所以推荐使用gbk编码。

GBK编码和gb2312编码都是采用2字节存储每个字符。

UTF-8:UTF-8:Unicode Transformation Format-8bit,。是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三个字节)来编码。UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。

UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上显示。如,如果是UTF8编码,则在外国人的英文IE上也能显示中文,他们无需下载IE的中文语言支持包。

简单的说,对于汉字的显示,使用国标码(gbk,gb2312)会更加节省空间,但是相对来说通用性更差,使用utf-8编码存储汉字会比使用国标码增加一半的空间消耗,但通用性更好。

Linux下编码问题

在Linux环境下经常会出现文件乱码的问题,这实际上就是因为文件编码,以Ubuntu为例,默认的字符编码为UTF-8,并且没有默认安装gbk和gb2312,所以需要我们进行安装和相应配置。

首先了解下locale指令,它是将有关当前语言环境或全部公共语言环境的信息写到标准输出上,输入指令,应该是不能找到gbk内容。

进行安装:

sudo locale-gen zh_CN.GBK

sudo locale-gen zh_CN.GB2312

sudo locale-gen zh_CN.GB18030

然后更新一下:

sudo dpkg-reconfigure locales

sudo locale-gen

看到有zh_CN.GBK,说明安装成功。

Vim编码原理及乱码处理:

    对应像vim这类的编辑器,还要另外加入两行配置文件,打开/etc/vim/vimrc文件,加上这两行内容。
    let &termencoding=&encoding
    set fileencodings=utf-8,gbk,gb18030,gb2312,big5
    然后就可以显示gbk,gb2312类的编码文件了。

    原理如下:(不感兴趣的就跳过吧,注意其没有涉及gvim,纯指字符终端下的vim)
    首先看四个vim中的参数:    
  • encoding:该选项使用于缓冲的文本(你正在编辑的文件),寄存器,Vim 脚本文件等等。你可以把 ‘encoding’ 选项当作是对 Vim 内部运行机制的设定。默认为当前系统的locale。
  • fileencodieng:Vim在保存新建文件时会根据fileencoding的设置编码来保存。如果是打开已有文件,Vim会根据打开文件时所识别的编码来保存,除非在保存时重新设置fileencoding。
  • fileencodings:该选项是vim写入文件时采用的编码类型。默认为自动辨认出来的编码(后面会讲到),系统会按顺序进行猜测。
  • termencoding:该选项代表输出到客户终端(Term)采用的编码类型,默认为空值。

再来看一下常见情况下这三个关键点的值以及在这种情况下这3个变量的值:

locale:目前大部分的Linux系统都以utf-8作为默认的locale了,这是兼容性最好的方式,可以在外部进行无损转换,locale 决定了vim中的encoding。

文件的编码以及自动编码识别,这方面牵扯到各种编码的规则,就不一一细讲了。但需要明白的是,文件编码类型并不是保存在文件内的,也就是说没有任何描述性的字段来记录文档是何种编码类型的。因此我们在编辑文档的时候,要么必须知道这文档保存时是以什么编码保存的,要么通过另外的一些手段来断定编码类型,这另外的手段,就是通过某些编码的码表特征来断定,例如每个字符占用的字节数,每个字符的ascii值是否都大于某个字段来断定这个文件属于何种编码。

这种方式vim也使用了,这就是vim的自动编码识别机制了。但这种机制由于编码各式各样,不可能每种编码都有显著的特征来辨别,所以是不可能100%准确的。对于我们GB2312编码,由于其中文是使用了2个acsii值高于127的字符组成汉字字符的,因此不可能把gb2312编码的文件与 latin1编码区分开来,因此自动识别编码的机制对于gb2312是不成功的,它只会将文件辨识为latin1编码。此问题同样出现在gbk,big5 上等。因此我们在编辑此类文档时,需要手工设定encoding和fileencoding。

相反很好理解,如果文档编码为utf-8时,一般vim都能自动识别正确的编码。

客户运行vim的终端所使用的编码类型:同第二条一样,这也是一个比较难以断定的关键点。第二个关键点决定着从文件读取内容和写入内容到文件 时使用的编码,而此关键点则决定vim输出内容到终端时使用的编码,如果此编码类型和终端认为它收到的数据的编码类型不同,则又会产生乱码问题。

首先能肯定的一点是,不通过远程访问而是本地访问,locale相同,所以不会存在这类问题。

但如果是远程登陆,问题就麻烦了,例如从1台locale为GB2310的系统(称作客户机)ssh到locale为utf-8的系统(称作服 务器)并开启vim编辑文档,在不加任何改动的情况下,服务器返回的数据为utf-8的,但客户机认为服务器返回的数据是gb2312的,按照 gb2312来解释数据,则肯定就是乱码了,这时就需要设置termencoding为gb2312来解决这个问题。

时间: 2024-08-24 18:09:45

UTF-8、GBK、GBK2312等字符编码的区别和vim乱码等相关问题研究。的相关文章

ASCII,Unicode,GBK和UTF-8字符编码的区别联系

ASCII,Unicode,GBK和UTF-8字符编码的区别联系 wyrssktzc11级分类:其他被浏览86次2016.05.27 检举 KingSta逍遥 采纳率:45%7级2016.05.27 ASCII.Unicode.GBK和UTF-8字符编码的区别联系 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称为"字节".再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出

ASCII、Unicode、GBK和UTF-8字符编码的区别联系

转自:http://my.oschina.net/u/658658/blog/411834?p={{currentPage+1}} 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称为”字节“.再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出很多状态,状态开始变来变去.他们看到这样是好的,于是它们就这机器称为”计算机“. 开始计算机只在美国用.八位的字节一共可以组合出256(2的8次

ASCII,Unicode,GBK和UTF-8字符编码的区别和联系

如果经常写python2,肯定会遇到各种"奇怪"的字符编码问题,每次都通过谷歌解决了,但是为什么会造成这种乱码.decode/encode失败等等,本文就字符和字符编码做一个总结,更加清晰区分诸多的编码. 字符集 一个系统支持的所有抽象字符的集合.字符是文字和符号的总称,包含各个国家文字.标点符号.图像符号.数字等.它为每一个字符分配一个唯一的ID,一般称之为码位.码点. 字符编码 它是一套规则,使用该规则能够将自然语言的字符的一个集合与其他东西的一个集合进行配对,在符号集合和数字系统

ASCII、Unicode、GBK和UTF-8字符编码的区别与联系

很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称为”字节“.再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出很多状态,状态开始变来变去.他们看到这样是好的,于是它们就这机器称为”计算机“. 开始计算机只在美国用.八位的字节一共可以组合出256(2的8次方)种不同的状态. 他们把其中的编号从0开始的32种状态分别规定了特殊的用途,一但终端.打印机遇上约定好的这些字节被传过来时,就要做

Python2和3字符编码的区别

Python2和3字符编码的区别 一.字符编码应用之Pyhton 1.1执行Python程序的三个阶段 test.py文件内容以gbk格式保存的,内容为: 阶段一:启动Python解释器 阶段二:Python解释器此时就是一个文本编辑器,负责打开文件test.py,即从硬盘中读取test.py的内容到内存中 此时,Python解释器会读取test.py的第一行内容,#coding:utf-8或#-*-coding:utf-8-*-,以此决定以什么编码格式将代码读入内存,这一行就是设定Python

字符集和字符编码的区别

转自:https://www.cnblogs.com/xdyixia/p/9114145.html 1.字符,字符集,字符编码概念 字符:在计算机和电信技术中,一个字符是一个单位的字形.类字形单位或符号的基本信息.即一个字符可以是一个中文汉字.一个英文字母.一个阿拉伯数字.一个标点符号等. 字符集:多个字符的集合.例如GB2312是中国国家标准的简体中文字符集,GB2312收录简化汉字(6763个)及一般符号.序号.数字.拉丁字母.日文假名.希腊字母.俄文字母.汉语拼音符号.汉语注音字母,共 7

Linux下修改MySQL数据库字符编码为UTF-8解决中文乱码

由于MySQL编码原因会导致数据库出现乱码. 解决办法: 修改MySQL数据库字符编码为UTF-8,UTF-8包含全世界所有国家需要用到的字符,是国际编码. 具体操作: 1.进入MySQL控制台 >mysql -uroot -p #输入密码进入 >status; #查看当前MySQL运行状态,如下图所示: 2.修改mysql配置文件 [[email protected] ~]# vi /etc/my.cnf #在[client]段增加下面代码 default-character-set=utf

字符编码的区别与介绍

8位一个字节,1字节=1bytes 字符编码的发展史: ASCII码:255个字符,每个字符只占1bytes >> 1980年: GB2312,7000多个汉字 >>1995年:GBK1.0,20000多个汉字 >>2000年:GB18030,27000多个汉字 >>90年代,出现Unicode(万国码,统一码,单一码),每个字符占2bytes >>utf-8:Unicode的扩展集.en:2bytes:zh:3bytes python3里面默认

PYTHON 之 字符编码的区别与介绍

理解字符编码的历史与使用原因 1.计算机只能认0与1.2.通过0与1,二进制数,计算机能很容易识别出各种数字.3.为了能让计算机识别各种字符,美国人制定了ASCII码,能识别出127种字母与特殊字符,只需使用一个字节.3.因为ASCII码不支持中文,在1980设计出gb2312 ,收录了7445个汉字.4.到了1995年 设计出BGK1.0 收录了2万多个汉字.5.到了2000年,设置出GB18030 收录了2万7千多个汉字.6.到了不个不知道什么年份的时候,国际组织为了统一全世界的字符,设置出