2013年5月31日星期五

X11,FVWM,GNOME,KDE的区别

X11 、XFree86 、KDE、GNOME、窗口管理器等相关概念
  1. 什么是 X11?
  X Window 系统版本 11,简称 X11,是一个对网络透明的客户/服务器架构的图形显示系统。它支持应用程序在你的屏幕上绘制象素,线条,文字,图象等等。 X11 还包括一些其它的辅助的函数库,使得它可以容易地绘制用户界面,例如:按钮,文本输入区等等。
  X11 是 Unix 事实上的图形系统标准。 Linux,各种 BSD 版本和多数的商用 Unix 都采用它。类似 CDE,KDE 和 GNOME 等桌面环境都运行在它之上。
  2. 什么是 XFree86?
  XFree86 是对 X11 的一个开放源码的实现。最初它开发运行在 Intel x86 PC 上,因此得名。现在,它可以运行在主要的硬件架构和操作系统上,包括 OS/2,Darwin,Mac OS X 和 Windows。
  3. 什么是窗口管理器?
  在多数图形环境中,窗口边框的外观(标题栏,关闭按钮,等)是由系统定义的。 X11 则不是这样。在 X11 中,窗口的框架(也称为"装饰")是由一个称为窗口管理器的单独程序提供的。一般认为,窗口管理器只是另外一个客户程序;它用通常的办法启动,并与 X 服务器按同样的方法通信。
  由很多不同的窗口管理器供我们选择。 xwinman.org有一个详细的清单。多数常见的窗口管理器都允许用户定制称为主题的窗口外观。许多窗口管理器还提供额外的功能,象在根窗口上的弹出菜单,docks,或程序启动按钮。
  4. 什么是 Gnome 和 KDE?
  他们都是桌面环境,另外还有很多类似的环境。他们的用途是给应用程序提供额外框架,使得他们的外观,使用感觉和行为在视觉上保持一致。例如:
  图形引擎:X11
  窗口管理器: sawfish
  桌面:Gnome
  图形显示引擎,窗口管理器和桌面之间的界限是模糊的,因为有些类似或相同的功能,会被其中之一或多个所同时实现。这也是为什么某个特定的窗口管理器可能不可以被另外一个特定的桌面环境所使用的原因。
  许多的程序会针对特定的桌面环境开发。多数程序可以在安装对应的桌面环境的函数库(以及相应的更底层的函数库)后,能够不减损或有限减损功能地运行。其中的例子是越来越多的 GNOME 程序精选 可以在不运行 GNOME 的情况下安装和运行。 不幸的是,对 KDE 应用程序却还没有取得类似的进展 。


X Windows与GNOME,KDE的关系 
   接触linux有一段时间了,最近在尝试debian,下了CD1之后不知道怎么进不了图形界面,在网上google了半天,原来自己没有装 GNOME,也就是桌面环境,安装的时候碰到几个概念没搞清:X Window是什么?X,X11,以及XFree86跟GNOME,KDE之间都是什么关系,最后终于在一个论坛上找到一个结果,感觉说的很有道理,回帖者也都认为是正解,所以把内容转载过来,希望能够对有同样疑问的人有所帮助:
 
关于linux图形界面的基本知识  
  很多LINUX初学者分不清楚linux和X之间,X和Xfree86之间,X和KDE,GNOME等之间是什么关系.常常混淆概念,我想以比较易于理解的方式说明一下X,X11,XFREE,WM,KDE,GNOME等之间的关系.由于本人水平有限可能存在错误,请高手指正.      
   
  一,linux本身没有图形界面,linux现在的图形界面的实现只是linux下的应用程序实现的.      
  图形界面并不是linux的一部分,linux只是一个基于命令行的操作系统,linux和Xfree的关系就相当于当年的DOS和WINDOWS3.0 一样,windows3.0不是独立的操作系统,它只是DOS的扩充,是DOS下的应用程序级别的系统,不是独立的操作系统,同样XFree只是 linux   下的一个应用程序而已.不是系统的一部分,但是X的存在可以方便用户使用电脑.WINDOWS95及以后的版本就不一样了,他们的图形界面是操作系统的一部分,图形界面在系统内核中就实现了,没有了图形界面windows就不成为windows了,但linux却不一样,没有图形界面linux还是   linux,很多装linux的WEB服务器就根本不装X服务器.这也WINDOWS和linux的重要区别之一.      
   
  二,X是协议,不是具体的某个软件:      
  X   是协议,就像HTTP协议,IP协议一样.这个概念很多初学者甚至学习LINUX有一定时间的人都混淆,一个基于X的应用程序需要运行并显示内容时他就联接到X服务器,开始用X协议和服务器交谈.比如一个X应用程序要在屏幕上输出一个圆那么他就用X协议对X服务器说:喂!我需要在屏幕上画一个圆.X应用程序只负责告诉X服务器在屏幕的什么地方用什么颜色画一个多大的圆,而具体的"画"的动作,比如这个圆如何生成,用什么显卡的驱动程序去指挥显卡完成等等工作是由X服务器来完成的.X服务器还负责捕捉键盘和鼠标的动作,假设X服务器捕捉到鼠标的左键被按下了,他就告诉X应用程序:亲爱的应用程序先生,我发现鼠标被按下了,您有什么指示吗?如果X应用程序被设计成当按下鼠标左健后再在屏幕上画一个正方形的话,X应用程序就对X服务器说:请再画一个正方形,当然他会告诉服务器在什么地方用什么颜色画多大的正方形,但不关心具体怎么画--那是服务器的事情.      
  那么协议是需要具体的软件来实现的,这就是下面我要讲的:      
   
  三,X和XFree86的关系.      
  有了协议就需要具体的软件来实现这个协议.就好比我们有了交通法规就需要交警去根据法规维护交通秩序一样.Xfree86就是这样一个去根据法规实现协议的   "交警".他按照X协议的规定来完成X应用程序提交的在屏幕上显示的任务.当然不仅仅是某个特定的交警才可以去维护和实现这个法规,比如还可以由交通协管员来实现交通法规,必要的时候警察也可以介入,当然前提是他们都要懂得交通法规,也就是要懂得协议.所以实现X协议的软件也并不只有XFree86,   XFree86只是实现X协议的一个免费X服务器软件.商业上常用MOTIF,现在还有XORG,还有很多很小的由爱好者写的小的X服务器软件.甚至可以在WINDOWS上有X服务器运行,这样你可以在linux系统上运行一个X应用程序然后在另一台windows系统上显示.多么神奇.你可以用   google找到这样的X服务器软件.只不过在LINUX上最常用的是XFree86.(现在的linux发行版都用Xorg了)顺便说一句,苹果电脑的图形界面用的也是X协议,而且被认为是做的最好的X协议图形界面,并且他对X协议的实施是做在系统内核里的,所以性能明显好很多,这就是为什么很多大型三维图形设计软件都是在苹果平台上的原因.      
  为了便于理解拿HTTP协议来比较:      
  协议是HTTP   (hyper   text   transmission   protocol)      
  实现这个协议的常用服务器有:apache   IIS   等      
  请求这些服务器传输文件的客户有:IE   ,MOZILLA   ,NETSCAPE等.      
  协议是X      
  实现这个协议的常用服务器有Xfree86   ,Xorg   ,Xnest等      
  请求这些服务器来完成显示任务的客户:所有的X应用程序.      
  只不过HTTP协议的服务器和客户端通常都在两台不同的电脑(服务器和客户机)之间来实现,所以一般人对这个比较容易理解.而X协议的服务器和客户端程序通常在同一台电脑上,因此很多用户都感到对此很难理解.既然是协议,那么肯定和平台无关的,因此可以让X应用程序显示在任何装有X服务器的远程计算机上. 甚至显示在装有Xnest服务器的windows系统上.只不过在大多数情况下,X应用程序都用本机的X服务器,然后X服务器将显示结果输出到本机的显示器.这也是很多人不理解X是一种协议的原因.      
   
  四,X和X11R6又是什么关系?      
  不知道初学者有没有注意到/usr/X11R6这个目录,这是XFree的默认安装目录      
  X11R6   实际上是   X   Protocol   version   11   Release   6      
  (X协议第11版第六次发行)的意思,就是说目前用的X协议是第11版的,然后经过了6次小的修正.不同版本的X协议是不能通信的.就象我们现在IPV4和IPV6不能通信一样,不过不用担心,现在的X服务器软件和X应用程序都遵循X11R6.      
  另外XFree86   3.3.6   XFree86   4.3.6   等这些版本是实现X协议的软件XFree86的版本号.这是初学者经常高混淆的概念.      
  协议版本和实现协议的软件的版本--这两个概念的区别你分清楚了吗?      
   
  五,X服务器和WM(window   manager   窗口管理器)之间是什么关系.      
  平时大家起动图形界面是怎么启动的呢?      
  如果你是一开己就进入图形界面那就太遗憾了.应为你错过了了解X服务器起动过程的好时机.不过没关系.你打开一个XTERM输入:      
  init   3      
  就可以安全的回到字符界面.      
  好了,等做完以下实验你就完全明白X和WM(window   manager   窗口管理器)之间是什么关系了.      
  先输入以下命令:      
  #startx      
  起动图形界面,你看到的是一个和平时使用一样的完整的图形界面操作环境.      
  你可以最大化,最小化,移动,关闭窗口等.      
  按ctrl+alt+backspace反回字符界面.      
  输入:      
  #xinit      
  再次启动图形界面,你看到了什么,你看到一个XTERM.而且不能移动.但是你可以在这个XTERM中输入命令打开X应用程序,如果我输入:      
  #mozilla      
  打开浏览器,你看到的浏览器和平时有什么不同吗?他在屏幕中间,不能移动,不能最小化,不能最大化,没有边框.      
  为什么同样一个X应用程序会有这样的不同呢?因为我们用startx起动图形界面的时候同时也启动了一个WM(即窗口管理器),如果你用KDE就起动了 KDE,如果你用GNOME就起动了GNOME.但是你用xinit起动图形界面的时候却没有起动WM.      
  现在你明白窗口管理器的作用了吗?他的作用就是最大化,最小化,移动,关闭窗口等.而这些不是X服务器来负责完成的.      
  如果你用xinit起动图形界面并在xterm中输入twm,看看会有什么?      
  xterm被加上了一个边框,你可以通过这个边框移动,最大化,最小化这个xterm,twm就是XFree86中自带的窗口管理器,是一个比较简陋的最简单的窗口管理器,但是他具有窗口管理器的全部特征.      
  如果你不输入twm而输入gnome-session就可以起动GNOME      
  或者输入startkde起动KDE.      
  通过以上的实验你就可以清楚的明白他们之间的关系.      
     
  六,关于KDE和GNOME      
  KDE   和GNOME是LINUX里最常用的图形界面操作环境,他们不仅仅是一个窗口管理器那么简单,   KDE是K   Desktop   Environment   的缩写.他不仅是一个窗口管理器,还有很多配套的应用软件和方便使用的桌面环境,比如任务栏,开始菜单,桌面图标等等.      
  GNOME是GNU   Network   Object   Model   Environment   的缩写.和KDE一样,也是一个功能强大的综合环境.      
  另外在其它UNIX系统中,常常使用CDE作为这样一个环境.      
  其它的小型窗口管理器有:      
  window   maker,after   step,blackbox,fvwm,fvwm2,等等都是常用的优秀窗口管理器.REDHAT9中有   window   maker   但是默认不安装,大家可以装来试试.只要xinit再wmaker&就可以用windowmaker了.      
  七,linux图形界面层次关系总结      
  linux本身-->X服务器<-[通过X协议交谈]->窗口管理器(综合桌面环境)-->X应用程序. 


X11,FVWM,GNOME,KDE的区别

我用Linux也有一段时间了,但是在看一些老鸟们的文章时经常看到一些WM啊,桌面啊,X11啊之类的词,我模模糊糊的知道这些都是关于图形介面的名词,但是具体什么区别就不知道了。

今天抽空稍微查了一下,终于知道了他们的区别。

X Window System
X Window 系统版本 11,简称 X11,是一个运行于UNIX上的对网络透明的客户/服务器架构的图形显示系统。X并不是UNIX核心的一部分,而是在核心之上的一个应用程序。X提供一种协议,用来产生图形用户界面GUI。X不会负责很多事情,它只负责绘制(Drawing),移动窗口(Moving windows),和鼠标、键盘交互。X11 是 Unix 事实上的图形系统标准。Linux,各种 BSD 版本和多数的商用 Unix 都采用它,类似 CDE,KDE 和 GNOME 等桌面环境都运行在它之上。但是Linux使用的是一个叫XFree86的免费X11实现来提供相同的功能。不过由于一些License的问题,现在 X11的实现已经变成XOrg了。在Linux里面可以到/etc/X11/xorg.conf看到其配置文件。

Window Manager
在多数图形环境中,窗口边框的外观(标题栏,关闭按钮,等)如何显示是由系统定义的。 X11 则不是这样。在 X11 中,窗口的框架(也称为"装饰")是由一个称为窗口管理器的单独程序提供的。一般认为,窗口管理器只是另外一个客户程序;它用通常的办法启动,并与 X 服务器按同样的方法通信。有很多不同的窗口管理器供我们选择。 xwinman.org有一个详细的清单。多数常见的窗口管理器都允许用户定制称为主题的窗口外观。许多窗口管理器还提供额外的功能,象在根窗口上的弹出菜单让用户启动程序,docks,或程序启动按钮,提供一个或多个虚拟桌面。有一些WM还提供与桌面环境(A Desktop Environment)交互接口。

WM的功能可以用简单的一个词来概括--中转。比如一个程序要求X11绘制一个窗口,这个请求会首先被重定向到WM,WM来确定如何绘制窗口的标题栏(caption)和边框(Frame),在X系统中,这两个元素是由WM决定的。因此用户在窗口上拖拉和缩放也是由WM来做出反应。大多数WM还支持窗口最小化,也就是变成一个在窗口底部的图标。这项工作不属于X系统核心协议之列,因此是一些WM自己实现的。

大多数WM还处理一些其他的任务,比如显示根窗口(root window),这个就是Linux里面的桌面,和windows的桌面是topmost window同样的概念。WM还处理在根窗口上的键盘和鼠标操作,比如Alt-F4关闭窗口之类的功能。


GNOME,KDE,xFce等
这些都是桌面环境(Desktop Envrionment),他们运行于WM之上,提供更完善的桌面集成功能,更自由的定制操作系统使用方式。X上面的桌面环境与windows,Mac OS X等不同,它可以自由组合,自由更改。大多数的DE由窗口管理器(WM),文件管理器(FM),一组主题(Theme)与其他用来管理桌面的程序和库组成。所有这些组件都可以单独调换,随意组合成自己想要的桌面环境。不过现在很多Linux发行版都有一个预先固定的组合比如GNOME,KDE等(这两个已经成为最流行,最成熟的DE了)。


x window是图形界面的基础,使机器能显示图形界面。
gnome KDE是建立在X window上的两种桌面环境
说白了,x windows是基础,他可以建立窗体
而这些窗体不可能同时的出于前台
这样就需要一个窗体管理起
gnome和kde一开始都是窗体管理器
后来慢慢的发展起来,成为了一个桌面环境了




IceWM , FVWM , Blackbox 这些是窗口管理器
KDE , Gnome 这些是桌面环境

桌面环境 = 窗口管理器 + 文件管理器 + 图形化桌面配置工具 + 浏览器 + 桌面应用程序 + 办公软件 等等


X 做的事情是在屏幕上画点、画线、写字
Window Manager 做的事情管理窗口的标题栏的样子、窗口之间如何重叠、如何提升、最小化等等
Desktop Environment 做的事情是提供一整套图形界面下使用的程序,如浏览器、邮件客户端等等

十个招数帮你轻松保护Linux系统

无论你是Linux的普通桌面用户还是管理多个服务器的系统管理员,你都面临着同样的问题:日益增加的各种威胁。Linux是一个开放式系统,可以在网络上找到许多现成的程序和工具,这既方便了用户,也方便了黑客,因为他们也能很容易地找到程序和工具来潜入Linux系统,或者盗取Linux系统上的重要信息。不过,只要我们仔细地设定Linux的各种系统功能,并且加上必要的安全措施,就能让黑客们无机可乘。

  一般来说,对Linux系统的安全设定包括取消不必要的服务、限制远程存取、隐藏重要资料、修补安全漏洞、采用安全工具以及经常性的安全检查等。本文教你十种提高Linux系统安全性的招数。虽然招数不大,但招招奏效,你不妨一试。

  1.部署防火墙

  这听起来像一条最“明显”的建议(就像使用健壮密码一样),但令人惊奇地是,很少有人真正去设置防火墙。即使你使用的路由器可能内置了防火墙,但是在Linux系统中部署一个软件防火墙是一件非常轻松的事情,你能够从中受益匪浅。

  图形防火墙,例如最近比较流行的Firestarter,非常适合定义口转发和监测活动规则。

  2.禁用不必要的网络

  般来说,除了http、smtp、telnet和ftp之外,其他服务都应该取消,诸如简单文件传输协议tftp、网络邮件存储及接收所用的imap/ipop传输协议、寻找和搜索资料用的gopher以及用于时间同步的daytime和time等。

  还有一些报告系统状态的服务,如finger、efinger、systat和netstat等,虽然对系统查错和寻找用户非常有用,但也给黑客提供了方便之门。例如,黑客可以利用finger服务查找用户的电话、使用目录以及其他重要信息。因此,很多Linux系统将这些服务全部取消或部分取消,以增强系统的安全性。

  3.使用更加安全的传输替代方式

  SSH是安全套接层的简称,它是可以安全地用来取代rlogin、rsh和rcp等公用程序的一套程序组。SSH采用公开密钥技术对网络上两台主机之间的通信信息加密,并且用其密钥充当身份验证的工具。

  由于SSH将网络上的信息加密,因此它可以用来安全地登录到远程主机上,并且在两台主机之间安全地传送信息。实际上,SSH不仅可以保障Linux主机之间的安全通信,Windows用户也可以通过SSH安全地连接到Linux服务器上。

  4.取消非root访问

  开始你可能对此感觉有些不方便,但你应确保正常用户不能访问系统工具---即使fsck和ifconfig等几乎“无害”的功能。达到这一效果的最好方法是使用sudo,Sudo程序允许一般用户经过组态设定后,以用户自己的密码再登录一次,取得超级用户的权限,但只能执行有限的几个指令。例如,应用 sudo后,可以让管理磁带备份的管理人员每天按时登录到系统中,取得超级用户权限去执行文档备份工作,但却没有特权去作其他只有超级用户才能作的工作。 Sudo不但限制了用户的权限,而且还将每次使用sudo所执行的指令记录下来,

  不管该指令的执行是成功还是失败。

  5.经常查看和拷贝日志

  网络管理人员要经常提高警惕,随时注意各种可疑状况,并且按时检查各种系统日志文件,包括一般信息日志、网络连接日志、文件传输日志以及用户登录日志等。在检查这些日志时,要注意是否有不合常理的时间记载。黑客往往会对日志进行修改已掩盖自己的痕迹,所以你要在一个非常规的地方保存一个日志的副本。最好能将日志单独房子一个远程服务器上。

  6.使用口令老化(password aging)

  口令老化一种增强的系统口令生命期认证机制,虽然它会一定程序的削弱用户使用的便利性,但是它能够确保用户的口令定期更换,这是一种非常好的安全措施。因此,如果一个帐户受到了黑客的攻击并且没有被发现,但是在下一个密码更改周期,他就不能再访问该帐号了。

  7.对root登录进行严格限制

  利用“root”身份登录不是一个好主意。安全的做法是你以普通用户的身份登录,然后利用su或sudo取得超级用户的权限,然后进行相应的工作。

  8.物理保护

  虽然大多数的攻击是依靠网络实施的,而黑客取得物理访问你的计算机的机会也非常渺茫,但这并不意味你无需设防。

  给引导程序加上密码保护,确保在你离开电脑时它总是处于锁定状态。并且你应该完全肯定没有人可以从外部设备启动你的服务器。

  9.安装最新的安全更新

  所有流行的Linux发行版除了定期发布更新外,只要遇到安全漏洞,研发人员也会很快发布相应得更新和补丁,你要做的就是经常关注有没有安全更新和补丁包发布,并及时安装。

  10.留意打开的文件

  很多Linux发行版都包含一些非常使用的小工具,lsof就是其中一个。Lsof能列出当前系统打开的所有文件。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。通过lsof工具能够查看哪些进程正在使用哪些端口,它的进程ID以及是谁在运行它。如果你从中发现了一些异常,那么你肯定值得仔细检查一番。

VIM 文件编码识别与乱码处理

在 Vim 中,有四个与编码有关的选项,它们是:fileencodingsfileencodingencodingtermencoding。在实际使用中,任何一个选项出现错误,都会导致出现乱码。因此,每一个 Vim 用户都应该明确这四个选项的含义。下面,我们详细介绍一下这四个选项的含义和作用。

1 encoding

encoding 是 Vim 内部使用的字符编码方式。当我们设置了 encoding 之后,Vim 内部所有的 buffer、寄存器、脚本中的字符串等,全都使用这个编码。Vim 在工作的时候,如果编码方式与它的内部编码不一致,它会先把编码转换成内部编码。如果工作用的编码中含有无法转换为内部编码的字符,在这些字符就会丢失。因此,在选择 Vim 的内部编码的时候,一定要使用一种表现能力足够强的编码,以免影响正常工作。
由于 encoding 选项涉及到 Vim 中所有字符的内部表示,因此只能在 Vim 启动的时候设置一次。在 Vim 工作过程中修改 encoding 会造成非常多的问题。如果没有特别的理由,请始终将 encoding 设置为 utf-8。为了避免在非 UTF-8 的系统如 Windows 下,菜单和系统提示出现乱码,可同时做这几项设置:
set encoding=utf-8
set langmenu=zh_CN.UTF-8
language message zh_CN.UTF-8

2 termencoding

termencoding 是 Vim 用于屏幕显示的编码,在显示的时候,Vim 会把内部编码转换为屏幕编码,再用于输出。内部编码中含有无法转换为屏幕编码的字符时,该字符会变成问号,但不会影响对它的编辑操作。如果 termencoding 没有设置,则直接使用 encoding 不进行转换。
举个例子,当你在 Windows 下通过 telnet 登录 Linux 工作站时,由于 Windows 的 telnet 是 GBK 编码的,而 Linux 下使用 UTF-8 编码,你在 telnet 下的 Vim 中就会乱码。此时有两种消除乱码的方式:一是把 Vim 的 encoding 改为 gbk,另一种方法是保持 encodingutf-8,把 termencoding 改为 gbk,让 Vim 在显示的时候转码。显然,使用前一种方法时,如果遇到编辑的文件中含有 GBK 无法表示的字符时,这些字符就会丢失。但如果使用后一种方法,虽然由于终端所限,这些字符无法显示,但在编辑过程中这些字符是不会丢失的。
对于图形界面下的 GVim,它的显示不依赖 TERM,因此 termencoding 对于它没有意义。在 GTK2 下的 GVim 中,termencoding 永远是 utf-8,并且不能修改。而 Windows 下的 GVim 则忽略 termencoding 的存在。

3 fileencoding

当 Vim 从磁盘上读取文件的时候,会对文件的编码进行探测。如果文件的编码方式和 Vim 的内部编码方式不同,Vim 就会对编码进行转换。转换完毕后,Vim 会将 fileencoding 选项设置为文件的编码。当 Vim 存盘的时候,如果 encodingfileencoding 不一样,Vim 就会进行编码转换。因此,通过打开文件后设置 fileencoding,我们可以将文件由一种编码转换为另一种编码。但是,由前面的介绍可以看出,fileencoding 是在打开文件的时候,由 Vim 进行探测后自动设置的。因此,如果出现乱码,我们无法通过在打开文件后重新设置 fileencoding 来纠正乱码。

4 fileencodings

编码的自动识别是通过设置 fileencodings 实现的,注意是复数形式。fileencodings 是一个用逗号分隔的列表,列表中的每一项是一种编码的名称。当我们打开文件的时候,VIM 按顺序使用 fileencodings 中的编码进行尝试解码,如果成功的话,就使用该编码方式进行解码,并将 fileencoding 设置为这个值,如果失败的话,就继续试验下一个编码。
因此,我们在设置 fileencodings 的时候,一定要把要求严格的、当文件不是这个编码的时候更容易出现解码失败的编码方式放在前面,把宽松的编码方式放在后面。
例如,latin1 是一种非常宽松的编码方式,任何一种编码方式得到的文本,用 latin1 进行解码,都不会发生解码失败——当然,解码得到的结果自然也就是理所当然的“乱码”。因此,如果你把 latin1 放到了 fileencodings 的第一位的话,打开任何中文文件都是乱码也就是理所当然的了。
以下是滇狐推荐的一个 fileencodings 设置:
set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1
其中,ucs-bom 是一种非常严格的编码,非该编码的文件几乎没有可能被误判为 ucs-bom,因此放在第一位。
utf-8 也相当严格,除了很短的文件外(例如许多人津津乐道的 GBK 编码的“联通”被误判为 UTF-8 编码的经典错误),现实生活中一般文件是几乎不可能被误判的,因此放在第二位。
接下来是 cp936 和 gb18030,这两种编码相对宽松,如果放前面的话,会出现大量误判,所以就让它们靠后一些。cp936 的编码空间比 gb18030 小,所以把 cp936 放在 gb18030 前面。
至于 big5、euc-jp 和 euc-kr,它们的严格程度和 cp936 差不多,把它们放在后面,在编辑这些编码的文件的时候必然出现大量误判,但这是 Vim 内置编码探测机制没有办法解决的事。由于中国用户很少有机会编辑这些编码的文件,因此我们还是决定把 cp936 和 gb18030 前提以保证这些编码的识别。
最后就是 latin1 了。它是一种极其宽松的编码,以至于我们不得不把它放在最后一位。不过可惜的是,当你碰到一个真的 latin1 编码的文件时,绝大部分情况下,它没有机会 fall-back 到 latin1,往往在前面的编码中就被误判了。不过,正如前面所说的,中国用户没有太多机会接触这样的文件。
如果编码被误判了,解码后的结果就无法被人类识别,于是我们就说,这个文件乱码了。此时,如果你知道这个文件的正确编码的话,可以在打开文件的时候使用 ++enc=encoding 的方式来打开文件,如:
:e ++enc=utf-8 myfile.txt

5 fencview

根据前面的介绍,我们知道,通过 Vim 内置的编码识别机制,识别率是很低的,尤其是对于简体中文 (GBK/GB18030)、繁体中文 (Big5)、日文 (euc-jp) 和韩文 (euc-kr) 之间的识别。而对于普通用户而言,肉眼看出一个文件的编码方式也是很不现实的事情。因此,滇狐强烈推荐水木社区的 mbbill 开发的 fencview 插件。该插件使用词频统计的方式识别编码,正确率非常高。点击这里 下载。


ZZ : http://edyfox.codecarver.org/html/vim_fileencodings_detection.html

firefox 个人配置文件夹详解,备份插件和个人信息

个人配置文件夹保存在什么地方?
Firefox 在不同的操作系统,配置文件夹的默认路径分别是:
操作系统     文件夹
Windows 9x/Me     C:\WINDOWS\Application Data\Mozilla\Firefox\Profiles\xxxxxxxx.default\
Windows 2000/XP/2003     C:\Documents and Settings\[User Name]\Application Data\Mozilla\Firefox\Profiles\xxxxxxxx.default\
Windows Vista     C:\Users\[user name]\AppData\Roaming\Mozilla\Firefox\Profiles\xxxxxxxx.default\
Linux     ~/.mozilla/firefox/xxxxxxxx.default/
Mac OS X     ~/Library/Application Support/Firefox/Profiles/xxxxxxxx.default/
    Windows 用户,您可以通过下面的方法进入配置文件夹:
点击“开始 > 运行...”,输入 %AppData%\Mozilla\Firefox\Profiles 并按下 Enter 即可。
    Linux 用户,请启动一个虚拟终端,输入 cd ~/.mozilla/ 便能进入 Firefox 的配置文件夹。
注:
    其 中的 [User Name] 是指登录系统时输入的用户名(默认是 “Administrator”,即 “C:\Documents and Settings\Administrator\Application Data\Mozilla”),而 Firefox 的配置文件是一个隐藏属性的文件夹,若看不到它,请在 “我的电脑->工具->文件夹选项->查看” 中选中 “显示所有文件和文件夹” 一项。
    xxxxxxxx 是一个8位的随机字符串。
    Linux 系统中,在终端下,首先请切换到个人的主目录中(在终端里输入 cd 即可),再请用 ls -a 来查看。
如果是在图形界面中,一般在文件管理器上面能找到相关选项显示隐藏文件。如:点击 “编辑 -> 首选项 -> 视图 -> 显示隐藏”。或者在查看(或其他)菜单里能找到 “显示隐藏文件” 项。
个人配置文件夹中有什么,为什么很重要?
配置文件是 Firefox 存放各项设置的地方,除此之外,浏览网页时存放的缓存、安装的扩展和主题也在其中。如果想将 Firefox 恢复到初始状态,只需删除配置文件夹即可。
部分文件说明:
    prefs.js:Firefox 的各项设定
    bookmarks.html:Firefox 的书签
    cookies.txt:Cookies
    hostperm.1:Cookies 允许/禁止列表
    downloads.rdf:下载历史
    formhistory.dat:表单输入历史记录
    mimeTypes.rdf:文件类型处理设定
    extensions.rdf:安装的扩展的信息
    search.rdf:搜索栏历史记录
    key3.db:密码文件,必须和 signons.txt 一起保存
    signons.txt:密码文件,必须和 key3.db 一起保存
部分文件夹说明:
    bookmarkbackups: 自动备份书签的文件夹,每当更改书签后,就能里面找到原来的书签,备份的文件加上了备份的日期,想恢复 时,请将文件重命名为 bookmark.html 再放到配置文件中,替换已有的 bookmark.html。(Firefox 1.5 以上版本才有这个文件夹)
    searchplugins:存放搜索引擎和其图标的文件夹。(Firefox 1.5 以上版本才有这个文件夹)
    Cache:Firefox 的缓存文件夹,Firefox 浏览过的网页的缓存文件默认是在个人配置文件夹的 \cache\ 目录下。
    extensions:存放主题和扩展的文件夹。安装后的 Extensions(扩展)就放在配置文件夹的 extensions 子目录下。删除 extensions 这个子目录就可将已安装的 extensions 全部删除。
如果是global安装,主题在firefox\extensins下的某个文件夹内;如果是local安装,主题在profile \extensons下某个文件夹内
win系统下,Firefox 的主题保存在类似下面这个文件夹中:
local:
C:\Documents and Settings\UserName\Application ata\Mozilla\Firefox\Profiles \dbuoun8g.default\extensions\{00D4154F-96D3-41ff-8E8E-113596D8670B}\
global:
D:\Program Files\Mozilla Firefox\extensions\{972ce4c6-7e08-4474-a285-3208198ce6fd}\
如何打开配置文件管理器 ( 如何新建配置文件 )?
在 Firefox 的启动路径后加上参数 “-p”(不带引号)或是 “-profilemanager”(不带引号)即可。如:
firefox -p
firefox -profilemanager
    Windows 系统,也可从开始菜单中选择 “开始--> 运行”,输入
firefox -p
如果不行,请输入 Firefox 的完整路径,然后加上参数“-p”(不带引号),如:
"C:\Program Files\MozillaFirefox\MozillaFirefox.exe" -p
打开配置文件管理器,您就可以增加、删除、重命名原来的配置文件了。另外请一定注意‘-p’前有空格。其中的 C:\Program Files\Mozilla Firefox\ 是指的 Firefox.exe 文件的具体路径,请根据自己情况调整。
    Linux 系统,请打开终端,切换到 Firefox 目录下,然后运行
./firefox -p

./firefox -profilemanager
启动 Firefox,并创建配置文件。如:
cd /usr/lib/firefox
./firefox -profilemanager
注意:
    打开配置文件管理器前,必须关闭 Firefox 的所有进程。WINDOWS 中在任务管理器中查看和关闭 Firefox;Linux 下则用 ps 和 kill 命令查看和关闭 Firefox。
    给 Firefox 建立新的配置文件时应该建一个新文件夹,少数朋友可能会图方便而利用一个已有的文件夹,比如放到桌面上,强烈建议您不要这样做。这是由于 Firefox 在删除其配置文件时,会删除该文件夹内的所有文档,若把配置文件夹放到桌面上,那么在删除这个配置文件后,你就会发现,除了我的电脑、我的文档、回收站之 外,其余东西都没了。因此请一定注意不要省略“新建文件夹”这一步。
如何完整的备份 Firefox 的所有设置?
    备份(复制)Firefox 的配置文件(profile)。
    备份(复制)安装目录下的 plugins(此目录下包括在线播放的一些插件和设置)
    备份(复制)安装目录下的 searchplugins(此目录下包括搜索引擎的的设置)
在重装系统后后,把以上三个备份的文件夹覆盖回去即可,这样所有的设置的配置、收藏夹、扩展等都和以前一样的。 推荐使用 MozBackup 备份软件。
注意:在安装新版本的 Firefox 时,最好是完全卸载 Firefox(仅保留书签),然后重新进行设置。
在启动时如何直接使用不同的配置文件?
创建了多个配置文件,启动时又不想启动配置文件管理器,只需在加“-p”时在后面带上创建的配置文件夹名称就行。例如,创建了多个配置文件后再启动 最初默认的配置文件,使用的参数为:
-p "default"
要注意的是在 -p 后,"default" 前有空格,并且加参数时必须区别大小写。
至于其余的配置文件的名称,则是在配置文件管理器中看到的名称。例如,在配置文件管理器中名称为 Default User 的配置文件,那么直接启动它的参数是:
-p "Default User"
要 更改 Firefox 的快捷方式以打开的配置文件,只需在Firefox的快捷方式上点击“鼠标右键→属性”,将 -p "profilename"添加到目标栏中即可。 最后要说明的是,添加的配置文件名是在配置文件管理器中显示的名称,不一定是磁盘中配置文件的实际名称(除非两个名称相同)。
ps:转载自http://hi.baidu.com/becaused/blog/item/67a56d81f5f08ddfbd3e1e78.html

谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词



这是一篇程序员写给程序员的趣味读物。所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG游戏的升级。整理这篇文章的动机是两个问题:
问题一:
使用Windows记事本的“另存为”,可以在GBK、Unicode、Unicode big endian和UTF-8这几种编码方式间相互转换。同样是txt文件,Windows是怎样识别编码方式的呢?
我很早前就发现Unicode、Unicode big endian和UTF-8编码的txt文件的开头会多出几个字节,分别是FF、FE(Unicode),FE、FF(Unicode big endian),EF、BB、BF(UTF-8)。但这些标记是基于什么标准呢?
问题二:
最近在网上看到一个ConvertUTF.c,实现了UTF-32、UTF-16和UTF- 8这三种编码方式的相互转换。对于Unicode (UCS2)、GBK、UTF-8这些编码方式,我原来就了解。但这个程序让我有些糊涂,想不起来UTF-16和UCS2有什么关系。
查了查相关资料,总算将这些问题弄清楚了,顺带也了解了一些Unicode的细节。写成一篇文章,送给有过类似疑问的朋友。本文在写作时尽量做到通俗易懂,但要求读者知道什么是字节,什么是十六进制。
0、big endian和little endian
big endian和little endian是CPU处理多字节数的不同方式。例如“汉”字的Unicode编码是6C49。那么写到文件里时,究竟是将6C写在前面,还是将49写在前 面?如果将6C写在前面,就是big endian。还是将49写在前面,就是little endian。
“endian”这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生过六次叛乱,其中一个皇帝送了命,另一个丢了王位。
我们一般将endian翻译成“字节序”,将big endian和little endian称作“大尾”和“小尾”。
1、字符编码、内码,顺带介绍汉字编码
字符必须编码后才能被计算机处理。计算机使用的缺省编码方式就是计算机的内码。早期的计算机使用7位的ASCII编码,为了处理汉字,程序员设计了用于简体中文的GB2312和用于繁体中文的big5。
GB2312(1980年)一共收录了7445个字符,包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。
GB2312支持的汉字太少。1995年的汉字扩展规范GBK1.0收录了21886个符 号,它分为汉字区和图形符号区。汉字区包括21003个字符。 2000年的GB18030是取代GBK1.0的正式国家标准。该标准收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。 现在的PC平台必须支持GB18030,对嵌入式产品暂不作要求。所以手机、MP3一般只支持GB2312。
从ASCII、GB2312、GBK到GB18030,这些编码方法是向下兼容的,即同一个 字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。在这些编码中,英文和中文可以统一地处理。区分中文编码的方法是高字节的最高位不为0。按 照程序员的称呼,GB2312、GBK到GB18030都属于双字节字符集 (DBCS)。
有的中文Windows的缺省内码还是GBK,可以通过GB18030升级包升级到GB18030。不过GB18030相对GBK增加的字符,普通人是很难用到的,通常我们还是用GBK指代中文Windows内码。
这里还有一些细节:
GB2312的原文还是区位码,从区位码到内码,需要在高字节和低字节上分别加上A0。
在DBCS中,GB内码的存储格式始终是big endian,即高位在前。
GB2312的两个字节的最高位都是1。但符合这个条件的码位只有 128*128=16384个。所以GBK和GB18030的低字节最高位都可能不是 1。不过这不影响DBCS字符流的解析:在读取DBCS字符流时,只要遇到高位为1的字节,就可以将下两个字节作为一个双字节编码,而不用管低字节的高位 是什么。
2、Unicode、UCS和UTF
前面提到从ASCII、GB2312、GBK到GB18030的编码方法是向下兼容的。而Unicode只与ASCII兼容(更准确地说,是与ISO-8859-1兼容),与GB码不兼容。例如“汉”字的Unicode编码是6C49,而GB码是BABA。
Unicode也是一种字符编码方法,不过它是由国际组织设计,可以容纳全世界所有语言文字 的编码方案。Unicode的学名是"Universal Multiple-Octet Coded Character Set",简称为UCS。UCS可以看作是"Unicode Character Set"的缩写。
根据维基百科全书(http://zh.wikipedia.org/wiki/)的记载:历史上存在两个试图独立设计Unicode的组织,即国际标准化组织(ISO)和一个软件制造商的协会(unicode.org)。ISO开发了ISO 10646项目,Unicode协会开发了Unicode项目。
在1991年前后,双方都认识到世界不需要两个不兼容的字符集。于是它们开始合并双方的工作成果,并为创立一个单一编码表而协同工作。从Unicode2.0开始,Unicode项目采用了与ISO 10646-1相同的字库和字码。
目前两个项目仍都存在,并独立地公布各自的标准。Unicode协会现在的最新版本是2005年的Unicode 4.1.0。ISO的最新标准是10646-3:2003。
UCS规定了怎么用多个字节表示各种文字。怎样传输这些编码,是由UTF(UCS Transformation Format)规范规定的,常见的UTF规范包括UTF-8、UTF-7、UTF-16。
IETF的RFC2781和RFC3629以RFC的一贯风格,清晰、明快又不失严谨地描述 了UTF-16和UTF-8的编码方法。我总是记不得IETF 是Internet Engineering Task Force的缩写。但IETF负责维护的RFC是Internet上一切规范的基础。
3、UCS-2、UCS-4、BMP
UCS有两种格式:UCS-2和UCS-4。顾名思义,UCS-2就是用两个字节编码,UCS-4就是用4个字节(实际上只用了31位,最高位必须为0)编码。下面让我们做一些简单的数学游戏:
UCS-2有2^16=65536个码位,UCS-4有2^31=2147483648个码位。
UCS-4根据最高位为0的最高字节分成2^7=128个group。每个group再根据 次高字节分为256个plane。每个plane根据第3个字节分为256行 (rows),每行包含256个cells。当然同一行的cells只是最后一个字节不同,其余都相同。
group 0的plane 0被称作Basic Multilingual Plane, 即BMP。或者说UCS-4中,高两个字节为0的码位被称作BMP。
将UCS-4的BMP去掉前面的两个零字节就得到了UCS-2。在UCS-2的两个字节前加上两个零字节,就得到了UCS-4的BMP。而目前的UCS-4规范中还没有任何字符被分配在BMP之外。
4、UTF编码
UTF-8就是以8位为单元对UCS进行编码。从UCS-2到UTF-8的编码方式如下:
UCS-2编码(16进制) UTF-8 字节流(二进制)
0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx
例如“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,所以肯定要用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是:0110 110001 001001, 用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。
读者可以用记事本测试一下我们的编码是否正确。
UTF-16以16位为单元对UCS进行编码。对于小于0x10000的UCS码,UTF- 16编码就等于UCS码对应的16位无符号整数。对于不小于 0x10000的UCS码,定义了一个算法。不过由于实际使用的UCS2,或者UCS4的BMP必然小于0x10000,所以就目前而言,可以认为UTF -16和UCS-2基本相同。但UCS-2只是一个编码方案,UTF-16却要用于实际的传输,所以就不得不考虑字节序的问题。
5、UTF的字节序和BOM
UTF-8以字节为编码单元,没有字节序的问题。UTF-16以两个字节为编码单元,在解释 一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。例如收到一个“奎”的Unicode编码是594E,“乙”的Unicode编码是 4E59。如果我们收到UTF-16字节流“594E”,那么这是 “奎”还是“乙”?
Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是“Bill Of Material”的BOM表,而是Byte Order Mark。BOM是一个有点小聪明的想法:
在UCS编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输 字符"ZERO WIDTH NO-BREAK SPACE"。
这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。
UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF(读者可以用我们前面介绍的编码方法验证一下)。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。
Windows就是使用BOM来标记文本文件的编码方式的。
6、进一步的参考资料
本文主要参考的资料是 "Short overview of ISO-IEC 10646 and Unicode" (http://www.nada.kth.se/i18n/ucs/unicode-iso10646-oview.html)。
我还找了两篇看上去不错的资料,不过因为我开始的疑问都找到了答案,所以就没有看:
"Understanding Unicode A general introduction to the Unicode Standard" (http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&;item_id=IWS-Chapter04a)
"Character set encoding basics Understanding character set encodings and legacy encodings" (http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&;item_id=IWS-Chapter03)
from http://blog.163.com/lgh_2002/blog/static/4401752620099135391219/

常见压缩文件的解压缩方法


本文介绍rar、zip、gz、bz2、tar文件的解压缩方法
rar
rar是目前Windows上最常用的格式,也是国内互联网上最流行的压缩格式。
rar的解压缩要使用rarlab提供的程序,也就是Linux版的rar,可以上网搜索下载。但多数的发行版,包括Debian,都提供rar的包(不过是non-free的),可以直接安装。
使用方法:
$ rar x rar文件名
该方法解压rar文件,包括rar文件中的目录结构
$ rar e rar文件名
解压rar文件,但不创建任何子文件夹
man rar 可以查看更多帮助
其实它的使用方法和WinRAR的控制台是一样的,也可以参照WinRAR的控制台参考使用rar
zip
也是Windows中常用的压缩格式,解压zip文件很简单:
$ unzip zip文件名
gz
gz是Linux下常用的压缩格式,它是比较快的压缩方案,但压缩效果似乎不好。
解压gz文件很简单:
$ gunzip sample.gz
bz2
bzip2的压缩效果通常gz要好,使用bunzip2进行解压
$ bunzip2 sample.bz2
tar
tar是一种打包工具,常和gz、bzip2一起使用,解压的方法是:
$ tar xvf sample.tar
$ tar xvfz sample.tar.gz
$ tar xvf sample.tar.bz2
x表示解压,v表示显示详细信息,f表示从文件输入而不是stdin。
注意用gz压缩的tar文件解压时要加上z,以示是gzip压缩的文件,而经过bz2压缩的则不用。
较新版本的 tar 已经支持自动检测压缩方式,所以可以直接使用 xf 参数解压所有压缩方式的 tar 文件。
$ tar xf sample.tar.bz2
$ tar xf sample.tar.gz
$ tar xf sample.tar

常见字符编码类型 汇总比较表

作者: 


字符集(编码标准)等同国际标准编码方式实现方式备注
ASCII国际标准ISO/IEC 646


EASCIIISO/IEC 8859-n

ASCII码由7位扩充为8位而成。EASCII的内码是由0到255共有256个字符组成。EASCII码比ASCII码扩充出来的符号包括表格符号、计算符号、希腊字母和特殊的拉丁符号。
ISO/ICE 8859-n


每个字集定义最多96个字母或符号,在0xA0-0xFF根据不同字符集放入不同的字符。
ISO-8859-n(与上面那个不同)


ISO-8859-n(在ISO与8859之间加上一连字号)则是由IANA根据ISO/IEC 8859-n所定义的编码表。它除了ISO/IEC 8859-n的字符外,还包括ASCII(0x20-0x7E)字符及65个控制字符(0x00-0x1F及0x7E-0x9F)。
Unicode
UCS-2,使用16位的编码空间
UCS-4,占用4字节编码空间
UTF-7
UTF-8
UTF-16
UTF-16 LE
UTF-16 BE
UTF-32
任何文字在Unicode中都对应一个值,这个值称为代码点(code point)。代码点的值通常写成 U+ABCD 的格式。
而文字和代码点之间的对应关系就是UCS-2(Universal Character Set coded in 2 octets)。UCS-4,即用四个字节表示代码点。
它的范围为 U+00000000~U+7FFFFFFF,其中 U+00000000~U+0000FFFF和UCS-2是一样的。
UCS-2和UCS-4只规定了代码点和文字之间的对应关系,并没有规定代码点在计算机中如何存储。
规定存储方式的称为UTF(Unicode Transformation Format),其中应用较多的就是UTF-16和UTF-8了。
ISO/IEC 10646
从Unicode 2.0开始,Unicode采用了与ISO 10646-1相同的字库和字码;ISO也承诺,ISO 10646将不会替超出U+10FFFF的UCS-4编码赋值,以使得两者保持一致。

GB2312
GB?2312字符使用两个字节来表示。“第一位字节”使用0xA1-0xF7,“第二位字节”使用0xA1-0xFEEUC-CNEUC
GBK
GBK是双字节编码,每个字符用两个字节表示。
GBK 同时也向下兼容GB2312 编码
GB18030 双字节字符的码位空间就是0x8140~0xFE7E和0x8180~0xFEFE,双字节字符的码位数目是7938+16002=23940。 0x8140~0xFE7E和0x8180~0xFEFE也是GBK的全部码位空间。GBK在这23940个码位中定义了21886个字符。
GB 13000



GB 18030
每个字可以由1个、2个或4个字节组成
单字节,其值从0到0x7F。
双字节,第一个字节的值从0x81到0xFE,第二个字节的值从0x40到0xFE(不包括0x7F)。
四字节,第一个字节的值从0x81到0xFE,第二个字节的值从0x30到0x39,第三个字节从0x81到0xFE,第四个字节从0x30到0x39。
Unicode转换格式(Unicode Translation Format,简称为 UTF)

字符编码的奥秘

 作者: 

计算机中的字是如何处理的?

如果你用放大镜看一下,可以看出屏幕上的字是由一个一个的像素点组成的,每一个字符用一组像素点拼接出来,这些 像素点组成一幅图像,变成了我们的文字,计算机又是如何将我们的文字保存起来的呢?是用一个个的点组成的图像将文字保存起来的吗?当然不是,让我们从英文 开始,由于英文是拼音文字,实际上所有的英文字符和符号加起来也不超过100个,在我们的文字中存在着如此大量的重复符号,这就意味着保存每个字符的图像 会有大量的重复,比如 e 就是出现最多的符号等等。所以在计算机中,实际上不会保存字符的图像。

什么是字符编码?

由于我们的文字中存在着大量的重复字符,而计算机天生就是用来处理数字的,为了减少我们需要保存的信息量,我们 可以使用一个数字编码来表示每一个字符,通过对每一个字符规定一个唯一的数字代号,然后,对应每一个代号,建立其相对应的图形,这样,在每一个文件中,我 们只需要保存每一个字符的编码就相当于保存了文字,在需要显示出来的时候,先取得保存起来的编码,然后通过编码表,我们可以查到字符对应的图形,然后将这 个图形显示出来,这样我们就可以看到文字了,这些用来规定每一个字符所使用的代码的表格,就称为编码表。编码就是对我们日常使用字符的一种数字编号。

第一个编码表 ASCII

在最初的时候,美国人制定了第一张编码表 《美国标准信息交换码》,简称 ASCII,它总共规定了 128 个符号所对应的数字代号,使用了 7 位二进制的位来表示这些数字。其中包含了英文的大小写字母、数字、标点符号等常用的字符,数字代号从 0 至 127,ASCII 的表示内容如下:
0 – 31         控制符号
32              空格
33-47           常用符号
48-57           数字
58-64           符号
65-90           大写字母
91-96           符号
97-127          小写字母
注意,32 表示空格,虽然我们再纸上写字时,只要手腕动一下,就可以流出一个空格,但是,在计算机上,空格与普通得字符一样也需要用一个编码来表示,33-127 共95个编码用来表示符号,数字和英文的大写和小写字母。比如数字 1 所对应的数字代号为 49,大写字母 A 对应的代号为 65, 小写字母 a 对应的代号为 97。所以,我们所写的代码 hello, world 保存在文件中时,实际上是保存了一组数字 104 101 108 108 111 44 32 119 111 114 108 100。我们再程序中比较英文字符串的大小时,实际上也是比较字符对应的 ASCII 的编码大小。
由于 ASCII 出现最早,因此各种编码实际上都受到了它的影响,并尽量与其相兼容。

扩展 ASCII 编码 ISO8859

美国人顺利解决了字符的问题,可是欧洲的各个国家还没有,比如法语中就有许多英语中没有的字符,因此 ASCII 不能帮助欧洲人解决编码问题。
为了解决这个问题,人们借鉴 ASCII 的设计思想,创造了许多使用 8 位二进制数来表示字符的扩充字符集,这样我们就可以使用256种数字代号了,表示更多的字符了。在这些字符集中,从 0 - 127 的代码与 ASCII 保持兼容,从 128 到 255 用于其它的字符和符号,由于有很多的语言,有着各自不同的字符,于是人们为不同的语言制定了大量不同的编码表,在这些码表中,从 128 - 255 表示各自不同的字符,其中,国际标准化组织的 ISO8859 标准得到了广泛的使用。
在 ISO8859 的编码表中,编号 0 – 127 与 ASCII 保持兼容,编号128 – 159 共32个编码保留给扩充定义的 32 个扩充控制码,160 为空格, 161 -255 的 95 个数字用于新增加的字符代码。编码的布局与 ASCII 的设计思想如出一辙,由于在一张码表中只能增加 95 种字符的代码,所以 ISO8859 实际上不是一张码表,而是一系列标准,包括 14 个字符码表。例如,西欧的常用字符就包含在 ISO8859-1字符表中。在 ISO8859-7种则包含了 ASCII 和现代希腊语字符。
问题出现了!
ISO 的8859标准解决了大量的字符编码问题,但也带来了新的问题,比如说,没有办法在一篇文章中同时使用 ISO8859-1 和 ISO8859-7,也就是说,在同一篇文章中不能同时出现希腊文和法文,因为他们的编码范围是重合的。例如:在 ISO8859-1 中 217号编码表示字符Ù ,而在 ISO8859-7中则表示希腊字符Ω,这样一篇使用 ISO8859-1 保存的文件,在使用 ISO8859-7编码的计算机上打开时,将看到错误的内容。为了同时处理一种以上的文字,甚至还出现了一些同时包含原来不属于同一张码表的字符的新码 表。

大字符集的烦恼

不管如何,欧洲的拼音文字都还可以用一个字节来保存,一个字节由8个二进制的位组成,用来表示无符号的整数的话,范围正好是 0 – 255。
但是,更严重的问题出现在东方,中国,朝鲜和日本的文字包含大量的符号。例如,中国的文字不是拼音文字,汉字的个数有数万之多,远远超过区区 256 个字符,因此 ISO 的 8859 标准实际上不能处理中文的字符。
通过借鉴 ISO8859 的编码思想,中国的专家灵巧的解决了中文的编码问题。
既然一个字节的 256 种字符不能表示中文,那么,我们就使用两个字节来表示一个中文,在每个字符的 256 种可能中,低于 128 的为了与 ASCII 保持兼容,我们不使用,借鉴 ISO8859的设计方案,只使用从 160 以后的 96 个数字,两个字节分成高位和低位,高位的取值范围从 176-247 共72个,低位从 161 – 254共94这样,两个字节就有 72 * 94 = 6768种可能,也就是可以表示 6768 种汉字,这个标准我们称为 GB2312-80。
6768 个汉字显然不能表示全部的汉字,但是这个标准是在1980年制定的,那时候,计算机的处理能力,存储能力都还很有限,所以在制定这个标准的时候,实际上只 包含了常用的汉字,这些汉字是通过对日常生活中的报纸,电视,电影等使用的汉字进行统计得出的,大概占常用汉字的 99%。因此,我们时常会碰到一些名字中的特殊汉字无法输入到计算机中的问题,就是由于这些生僻的汉字不在 GB2312 的常用汉字之中的缘故。
由于 GB2312 规定的字符编码实际上与 ISO8859 是冲突的,所以,当我们在中文环境下看一些西文的文章,使用一些西文的软件的时候,时常就会发现许多古怪的汉字出现在屏幕上,实际上就是因为西文中使用了 与汉字编码冲突的字符,被我们的系统生硬的翻译成中文造成的。
不过,GB2312 统一了中文字符编码的使用,我们现在所使用的各种电子产品实际上都是基于 GB2312 来处理中文的。
GB2312-80 仅收汉字6763个,这大大少于现有汉字,随着时间推移 及汉字文化的不断延伸推广,有些原来很少用的字,现在变成了常用字,例如:朱镕基的“镕”字,未收入GB2312-80,现在大陆的报业出刊只得使用 (金+容)、(金容)、(左金右容)等来表示,形式不一而同,这使得表示、存储、输入、处理都非常不方便,而且这种表示没有统一标准。
为了解决这些问题,全国信息技术化技术委员会于1995年12月1日《汉字内码扩展规 范》。GBK向下与GB2312完全兼容,向上支持ISO 10646国际标准,在前者向后者过渡过程中起到的承上启下的作用。GBK 亦采用双字节表示,总体编码范围为8140-FEFE之间,高字节在81-FE之间,低字节在40-FE之间,不包括7F。在 GBK 1.0 中共收录了 21886个符号,汉字有21003个。
GBK 共收入21886个汉字和图形符号,包括:
* GB2312 中的全部汉字、非汉字符号。
* BIG5 中的全部汉字。
* 与ISO 10646相应的国家标准GB13000中的其它CJK汉字,以上合计20902个汉字。
* 其它汉字、部首、符号,共计984个。
微软公司自Windows 95 简体中文版开始支持GBK代码,但目前的许多软件都不能很好地支持GBK汉字。
GBK 编码区分三部分:
* 汉字区 包括
GBK/2 :OXBOA1-F7FE, 收录GB2312汉字6763个,按原序排列;
GBK/3 :OX8140-AOFE,收录CJK汉字6080个;
GBK/4 :OXAA40-FEAO,收录CJK汉字和增补的汉字8160个。
* 图形符号区 包括
GBK/1 :OXA1A1-A9FE,除GB2312的符号外,还增补了其它符号
GBK/5 :OXA840-A9AO,扩除非汉字区。
* 用户自定义区
即GBK区域中的空白区,用户可以自己定义字符。
GB18030 是最新的汉字编码字符集国家标准, 向下兼容 GBK 和 GB2312 标准。 GB18030 编码是一二四字节变长编码。 一字节部分从 0x0~0x7F与 ASCII 编码兼容。二字节部分, 首字节从 0x81~0xFE, 尾字节从 0x40~0x7E 以及 0x80~0xFE, 与 GBK标准基本兼容。 四字节部分, 第一字节从 0x81~0xFE, 第二字节从 0x30~0x39, 第三和第四字节的范围和前两个字节分别相同。

不一样的中文

中文的问题好像也解决了,且慢,新的问题又来了。
中国的台湾省也在使用中文,但是由于历史的原因,那里没有使用大陆的简体中文,还在使用着 繁体的中文,并且他们自己也制定了一套表示繁体中文的字符编码,称为 BIG5,不幸的是,虽然他们的也使用两个字节来表示一个汉字,但他们没有象我们兼容 ASCII 一样兼容大陆的简体中文,他们使用了大致相同的编码范围来表示繁体的汉字。天哪! ISO8859 的悲剧又出现在同样使用汉字的中国人身上了,同样的编码在大陆和台湾的编码中实际上表示不同的字符,大陆的玩家在玩台湾的游戏时,经常会遇到乱码的问题, 问题根源就在于,大陆的计算机默认字符的编码就是 GB2312, 当碰到台湾使用 BIG5 编码的文字时,就会作出错误的转换。
由于历史和文化的原因,日文和韩文中也包含许多的汉字,象汉字一样拥有大量的字符,不幸的 是,他们的字符编码也同样与中文编码有着冲突,日文的游戏在大陆上一样也会出现无法理解的乱码。《中文之星》,《南极星》,《四通利方》就是用于在这些编 码中进行识别和转换的专用软件。

互联的时代

在二十世纪八十年代后期,互联网出现了,一夜之间,地球村上的人们可以直接访问远在天边的服务器,电子文件在全世界传播,在一切都在数字化的今天,文件中的数字到底代表什么字?这可真是一个问题。
UNICODE
实际上问题的根源在于我们有太多的编码表。
如果整个地球村都使用一张统一的编码表,那么每一个编码就会有一个确定的含义,就不会有乱码的问题出现了。
实际上,在80年代就有了一个称为 UNICODE 的组织,这个组织制定了一个能够覆盖几乎任何语言的编码表,在 Unicode3.0.1中就包含了 49194 个字符,将来,Unicode 中还会增加更多的字符。Unicode 的全称是 Universal Multiple-Octet Coded Character Set ,简称为 UCS。
由于要表示的字符如此之多,所以一开始的 Unicode1.0编码就使用连续的两个字节也就是一个WORD 来表示编码,比如“汉”的UCS 编码就是 6C49。这样在 Unicode 的编码中就可以表示 256*256 = 65536 种符号了。
直接使用一个WORD 相当于两个字节来保存编码可能是最为自然的 Unicode 编码的方式,这种方式被称为 UCS-2,也被称为 ISO 10646,,在这种编码中,每一个字符使用两个字节来进行表示,例如,“中” 使用 11598 来编码,而大写字母 A 仍然使用 65 表示,但它占用了两个字节,高位用 0 来进行补齐。
由于每个WORD 表示一个字符,但是在不同的计算机上,实际上对 WORD 有两种不同的处理方式,高字节在前,或者低字节在前,为了在UCS-2编码的文档中,能够区分到底是高字节在前,还是低字节在前,使用 UCS-2 的文档使用了一组不可能在UCS-2种出现的组合来进行区分,通常情况下,低字节在前,高字节在后,通过在文档的开头增加 FFFE 来进行表示。高字节在前,低字节在后,称为大头在前,即Big Endian,使用 FFFE 来进行表示。这样,程序可以通过文档的前两个字节,立即判断出该文档是否高字节在前。
Endian 这个词出自 《格列佛游记》,小人国的内战就源于吃鸡蛋时要先吃大头 big endian 还是小头 little-endian,并由此发生了内战。

理想与现实

UCS-2 虽然理论上可以统一编码,但仍然面临着现实的困难。
首先,UCS-2 不能与现有的所有编码兼容,现有的文档和软件必须针对 Unicode 进行转换才能使用。即使是英文也面临着单字节到双字节的转换问题。
其次,许多国家和地区已经以法律的形式规定了其所使用的编码,更换为一种新的编码不现实。比如在中国大陆,就规定 GB2312 是大陆软件、硬件编码的基础。
第三,现在还有使用中的大量的软件和硬件是基于单字节的编码实现的,UCS-2 的双字节表示的字符不能可靠的在其上工作。

新希望 UTF-8

为了尽可能与现有的软件和硬件相适应,美国人又制定了一系列用于传输和保存Unicode 的编码标准 UTF,这些编码称为UCS 传输格式码,也就是将 UCS 的编码通过一定的转换,来达到使用的目的。常见的有 UTF-7,UTF-8,UTF-16等。
其中 UTF-8 编码得到了广泛的应用,UTF-8 的全名是UCS Transformation Format 8, 即 UCS 编码的8位传输格式,就是使用单字节的方式对 UCS 进行编码,使 Unicode 编码能够在单字节的设备上正常进行处理。
UTF-8 编码是变长的编码,对不同的 Unicode 可能编成不同的长度
UCS-2                           UTF-8
0000-007F    0- 127            0xxxxxxx
0080-07FF 128- 2047            110xxxxx 10xxxxxx
0800-FFFF 2048-65535            1110xxxx 10xxxxxx 10xxxxxx
例如 1 的Unicode 编码是 31 00,在 0-127之间,所以转换后即为 31,而“中”字的UTF-8 Unicode 编码为 11598,转换成 UTF-8则为 e4 b8 ad。
实际上,ASCII 字符用 UTF-8 来表示后,与 ASCII 是完全一样的,美国人又近水楼台的把自己的问题解决了。但其他的编码就没有这么幸运了。
突破障碍 - Unicode 与 本地编码的转换
UTF-8 编码解决了字符的编码问题,又可以在现有的设备上通行,因此,得到了广泛的使用,
在人间

XML 中的问题

XML 的设计目标是实现跨网络,跨国界的信息表示,所以,在XML 设计之初,就规定 XML 文件的默认编码格式就是 UTF-8,也就是说,如果没有特殊的说明,XML文件将被视为 UTF-8 编码。
然而,大部分的中文编辑软件,是根据操作系统来决定编码的方式的,所以,在写字板中直接输入并保存的文件,将被保存为 GB2312 编码,所以,在读出 XML文件内容时,往往就会出现文件错误的提示了。这种情况会出现在文件中有中文出现的时候,如果没有中文,只有英文信息,就不会出现问题。原因很简单, 有中文时,因为中文的编码并不是UTF-8 编码,所以会造成冲突,没有中文时,英文的编码在GB2312 中与ASCII是兼容的,而ASCII 与UTF-8 是完全一致的,所以不会出现问题。这种情况也包括 UltraEdit 软件。
但时,专业的 XML编辑软件会自动将内容保存为 UTF-8 编码,不会有问题。
在通过DOM或XSLT保存 XML 文件时也有着同样的问题。
默认情况下,XML 的处理程序一般会将内容作为 UTF-8 编码进行处理,所以保存下来的 XML 文件必须要用可以识别 UTF-8 的软件来进行查看,如Windows 的记事本。

Java 的处理

Java 的设计目标是一次编写,到处运行,所以在 Java 的内部对字符的处理采用了 UCS 来处理,因此 Java 的字符类型不再是 C++ 中的一个字节,而使用两个字节来保存一个字符。
但是,我们会发现,在 Java 的文件流中保存为文件后,我们可以直接使用记事本或 UltraEdit 打开察看。
在这里,Java 采用了一个灵巧的默认转换机制,当需要将内容中的字符保存到文件中时,Java 会自动的查看一下系统的本地编码,系统的本地编码可以在控制面板中查到,然后,自动将 UCS 编码的字符转换为本地编码,并进行保存。当需要从系统的文件系统中读入一个文件时,Java 通过查看系统的本地编码来决定如何识别文件的内容。这样,Java 就可以在内部使用 UCS, 但用户可以直接使用本地编码的文件了。
Java 在相应的方法中,提供了额外的参数,可以让用户自己来指定文件的编码。

.Net 的处理

在微软的 .Net 内部,同样使用 UCS 编码,但是,在对文件进行处理的时候,与Java 有一些区别,.Net 不查询系统的本地编码,而是直接使用磨人的 UTF-8 编码进行文件的处理,所以,你保存的中文内容,在 UltraEdit 中可能就是乱码,但是,如果你使用记事本打开的话,就不会有问题,因为 Windows 的记事本可以识别 UTF-8 的编码。
.Net 软件的配置文件使用 XML 格式,默认的编码一样是 UTF-8 ,所以,必须使用可以识别 UTF-8 的软件进行处理,如:vs.net,记事本等。
在 .Net 中,网页默认处理编码就是 UTF-8。

Web 中的问题

网页的编码问题主要有两点,一是网页是如何编码的,二是如何告诉浏览器如何编码的。
第一个问题,又可以分成静态页面和动态页面两个问题。
对静态页面,网页的编码要看你保存文件时的编码选项,多数的网页编辑软件可以让你选择编码的类型,默认为本地编码,为了使网页减少编码的问题,最好保存为 UTF-8 编码格式。
对动态页面,如 Servlet 生成的页面,在 HttpServletResponse 类中有一个方法 setContentType,可以通过参数来指定生成的页面的类型和编码,例 如:response.setContentType("text/html; charset=utf-8");来指定生成的页面的编码类型。
对 jsp 页面可以通过 <%@ page contentType="text/html;charset=gb2312" %> 来指定生成的页面的编码及类型。
第二个问题,如何通知浏览器网页的编码类型。
浏览器收到只是一个字节流,它并不知道页面是如何编码的,因此,需要一个机制来告诉浏览器 页面的编码类型,标准的机制是使用 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 来指定页面的编码,当浏览器读取页面遇到这样的指示时,将使用这里制定的编码方式重新加载页面。
否则的话,浏览器将会试图猜出页面的编码类型。

Tomcat 中的中文问题

在 Tomcat 中,经常遇到取回客户端提交的信息是乱码的问题。
当提交表单的时候,HTML页面的Form标签会使情况变得更为复杂。浏览器的编码方式取 决于当前页面的编码设定,对Form标签也照此处理。这意味着如果ASCII格式的HTML页面用ISO-8859-1编码,那么用户在此页面中将不能提 交中文字符。所以,如果你的页面使用的是 utf-8,那么 POST 的时候,也将使用 utf-8 。
由于 Tomcat 是美国人设计的,Tomcat 默认使用ISO8859-1 编码队客户端返回的内容进行解码,由于编码与内容不一致,就会出现乱码的 ??? 出现,根据以上的分析,在服务器端读取客户端回送的内容时,需要首先设定回送内容的编码,然后再进行信息的读取,通过使用 HttpServletRequest 的方法 setCharacterEncoding("utf-8")先行设定信息的编码类型。然后,就可以正确读取内容了。

总结

编码问题是信息处理的基本问题,但是由于历史和政治的问题,事实上存在着大量不统一的编码 方式,造成在信息处理过程中的信息丢失,转换错误等问题,UCS 为问题的解决提供了一个很好的方向,但是,在现在的软件环境中,还没有达到全面地使用。在实际中工作中应尽量采用统一的编码格式,减少编码问题的发生