关于中文编码(gb)
这里有几个小技巧:
一、在php中,字符编码是按所发送的编码为准的,因此使用的就是用户输入的编码,不会自动改变,但在asp中,默认的编码是unicode,这样我们很容易就能得到gbk->unicode的编码对照表,这样即使在毫无基础库的情况下也能很容易的实现gbk到utf-8的转换了;
二、由于GBK是高位最低数值是0x40,即是64,因此,有时候组织一些涉及中文的字串时,分割字符最好用64之前的ascii码,这样在任意情况下替换或分割都不会出现乱码,比较常用的是 ","、";"、":"、" "、" "、" ",这些字符永远都不会给gb编码添乱
GB编码的发展
- GB2312->GBK->GB18010(向下兼容)
- 最早的GB码是用两个字节的区分存储机制,区位分别减去0xA0,再减1就得到汉字在编码表中的序号,该序号用来对应字型码中相应位置的汉字
关于unicode和utf-8
- linux系统默认编码方式是utf-8(windows是utf16le),utf-8是一种存储编码,一般用三个字节来存储汉字,其格式为1110XXXX 10XXXXXX 10XXXXXX,其中X代表0000 0800 - 0000 FFFF的unicode编码
- 关于unicode的解码:如果一个字节的第一位是 0 ,则说明这个字节对应一个字符;如果一个字节的第一位1,那么连续有多少个 1,就表示该字符占用多少个字节。
为什么有了uncoded还要有utf-8?
接下来我们讨论一下必要性:在unicode里面,每一个字符都用一个二进制码位序列来表示,这个仅仅代表该字符在字符集中的序号,而并不能用来作为存储的码位,这是因为二义性的存在,所谓二义指当不同的字符的长度不一致时,我们如何判断这些字符是一个字节还是多个字节,当然我们也可以严格规定一个字符的长度,但是这会造成存储空间的浪费,同时也无法严格的与其他编码进行区分。所以从存储的角度出发,utf系列编码就出现了,其中utf-16先出现,规定了两字节的基本面编码和四字节(用两个处于空置区的基本面来表示)的辅助面,而后就是我们现在使用最广泛的utf-8了
关于utf-8
UTF-8 最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
UTF-8 的编码规则很简单,只有二条:
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。
2)对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。

在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。
下面举个简单的例子:我们打开记事本编辑保存
1.创建.txt文件存在于内存中,此时文件以unicode编码
2.从键盘输入一段文字,键盘按照一定的外码组织文字以unicode编码格式放入内存文件缓冲区,并同时按照编辑器的编码方式显示出来(可能会乱码)
3.编辑完毕,保存时,内存中以unicode存在的文件转化为utf-8(当然你也可以自己去设定编码方式)
4.如果需要用另外一个编辑器去打开文件时,首先也是转化为uncode至内存,然后编辑器寻找最匹配的文件编码格式(如果不存在源文件的编码格式或者判断出错,可能就会乱码)去打开文件输出到终端
- 而对于一般的浏览器,服务器是将动态生成的unicode内容转化为utf-8传输到浏览器显示
乱码问题的本质
存取编码方式不一致
- 一个关键的问题是编码方式的识别,这也是之前介绍utf-8时说的。
- 在vim里面,对于一个未知编码的文件首先在fileencodings里面匹配编码格式,如果匹配上了,记住此编码方式,将其转化成encoding编码格式,放到内存里面,然后内存输出到终端以终端编码方式显示,如果果文件的编码没有被匹配,则encoding之后将会失去语义,导致输出乱码;存文件的时候将缓冲区的内容以fileencoding方式保存到磁盘上面
- 其中从键盘输入到缓冲区的编码是encoding格式的
- 其中编码格式的探测很重要,所以在/etc/vim/vimrc里面设置fileencodings要尽量全面,优先常用的编码格式,encoding基本包含所有的字符,所以fileencoding基本都能成功转化。
网友评论