注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

My Unix World

不要迷恋Unix,Unix只是计算世界很小的一部分!

 
 
 

日志

 
 

[转]Emacs 的编码系统  

2009-02-24 00:56:15|  分类: utility-emacs |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

转载简介:

文字需要经过一定的编码之后才能在计算机中存储和处理,不论是哪种语言的文字或者标点符号等之类的符号。英语的编码称为ASCII,包括52个字母(大小写),标点,数字和一些控制符号。其他的欧洲语言编码也相对容易,这些编码分别称为IISO-8859-1,SO-8859-2,,,,,,,ISO-8859-15,用于编码欧洲各国的语言。比如英文love一词,用4个编码单元表示,在计算机中表示为4个独立的ASCII编码。区分单词的空格,回车,标点,这些都有对应的编码。在用户要打开文件的时候,计算机把编码变成人可以阅读字符。东亚地区的编码比较繁琐,因为汉字的数量极为庞大。最简单的简体汉字编码是GB2312,它收录了最常用的六七千个汉字,由于这不够用,后来出现了GBK,GB13000等。繁体中文也有几套编码方法,其中最著名的是Big5,一般流行于台湾。东亚地区的编码有时候统一处理,称为CJK,这分别取了三个国家的首字母。

这种各国或地区相互独立为政的局面不利于各国之间的交流,所以出现了Unicode编码,这种编码统一和涵盖了全球几乎所有的语言文字,是以后编码发展的趋势。目前处于过渡阶段。Google等全球网站的编码一般采用Unicode,而国内的小站仍然多采用GB2312.

在浏览器的“视图”-》“编码”里面可以自己设定当前页面的编码方式。有时候编码不对出现乱码的时候,也可以手动调整一下。简体中文一般调成“GB2312”或“Utf-8”(Unicode的实际表示形式),台湾的网站多需要调成Big5.

Windows中大部分工作,已经默认设定好了,所以不需要关心编码也可以使用。但Linux下很多就要自己设置。这篇文章就是讲述了Emacs编辑器的编码原理。

以下是原文,如果不接触Emacs则不需要阅读。

======================================================

Emacs 的编码系统这个话题太大了,得写一篇很长的文章才能说清楚。而且 对于用户来说,可能并不感兴趣,也不关心这个。

Emacs22 的编码原理是让多个国家的编码系统共存。buffer里的每一个字符 都用 1-4 个字节表示,比如 gb2312 的汉字就是用3个字节表示,这三个 字节中的第一个字节叫 leading byte, 说明了这个字符所属的字符集,后 面两个字节是这个字符的gb2312编码。chinese-gb2312 的 leading byte 是 0x91, big5 因为比较大,所以分成了两个 charset: chinese-big5-1 和 chinese-big5-2, leading byte 分别是 0x98 和 0x99。

所以对于 Emacs22 来说,只要查看一个字符的 leading byte,就可以知道 它属于哪个字符集,一看是 0x91 就知道它是 gb2312 字符,一看是 0x98 就知道它是 big5 字符。所以一个汉字可能会有好几种内部编码,比如“好” 字,gb2312, big5, 朝鲜文, 日文中都有这个字,那么它就有四种内部编码。

当 Emacs22 打开一个文件的时候,就需要判断出这个文件的编码系统,然 后给文件中的每个字符加上 leading byte,放到内存中,Emacs22把这个过 程叫做 decode。当emacs22保存文件时就需要根据每个字符的 leading byte 把它转换成相应字符集的编码,再写到文件中,emacs22把这个过程叫 做 encode。

为了演示 Emacs decode/encode 的过程,我们可以做个小实验:
- 新建一个文件 ~/test.txt
- 输入“中文”两个字
- C-x <return> f gb2312
- C-x C-s 保存文件
- 在 *scrach* buffer 里输入
(insert-file-contents-literally "~/test.txt")
C-j 一下可以看到 326320316304 ,这是八进制的“中文”两个字的编码。
- 现在打开 ~/test.txt,然后执行
M-x toggle-enable-multibyte-characters
我们可以看到 221326320221316304,Emacs在每个汉字的编码前都加 上了一个 221,正是十六进制的 0x91——gb2312的 leading byte。

然而,leading byte 的数量是有限的,而世界上的字符集却越来越多,因 此当 gbk 和 gb18030 出现以后,就没有合适的 leading byte 分配给它们, 所以 Emacs22 不支持 gbk 和 gb18030。

苏勇和詹剑写的 mule-gbk,实际上是把全部的gbk字符分成了三部分,分别 占用了 chinese-cns-5, chinese-cns-6, chinese-cns-7 的 3 个 leading byte。mule-gbk 的主要代码就是把 gbk 中的字符加上这三个 leading byte 之一,放入内存,也就是 decode;或者反过来把内存中带有 这三个 leading byte 之一的字符转换成 gbk 编码,也就是 encode。 Emacs为了方便进行各种编码的转换,专门内嵌了一种称为 ccl 的语言,编 码转换部分的代码就是用 ccl 写成的。

Emacs23的编码原理是把所有的字符集都转换成 utf-8,内部字符都是 utf-8 编码。这样对于每个字符集都需要两张表,一个是 charset --> utf-8,另一个是 utf-8 --> charset。Emacs23源码的 etc/charsets/ 目录 下有很多 *.map 文件,就是这种转换表。

当Emacs23打开一个文件时,先判断文件的编码,然后加载相应的表格,再 按照表格把文件中的字符一个一个转换成 utf-8 放入内存;保存文件时, 也是按照表格把内部的 utf-8 编码转换成相应的字符集编码。

unicode 的全部编码可以分成很多 block,在 www.unicode.org 可以查到。 由于中国参与 unicode 的制定比较晚,因此造成了gb2312/gbk/gb18030中 的字符被分配到了很多不同的 block 中,汉字还相对比较连续,标点符号 就特别分散,这个block中有几个,那个block中有几个。

Emacs 23 在进行 fill 时不整齐的原因,主要是那些标点符号的宽度属性 设置错误,本来应该是2,却设成了1,因此 fill 时计算行宽不准确,标点 符号越多,误差越大。我的那个patch主要是更改了这些标点符号的宽度属 性。

  评论这张
 
阅读(345)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017