Chinaunix首页 | 论坛 | 博客
  • 博客访问: 34274
  • 博文数量: 18
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 160
  • 用 户 组: 普通用户
  • 注册时间: 2010-02-02 11:21
文章分类
文章存档

2010年(18)

我的朋友

分类: LINUX

2010-08-27 16:35:08

在Ubuntu下工作呢很长一段时间了, 项目开发的时候一直都用UTF-8编码,但是最近来了个项目要求使用GBK编码,但是在Ubuntu下Eclipse不能支持GBK,上网搜了下无果。只有自己想办法了。
首先更改locale 在伪终端下执行export LANG=zh_CN.GB18030(注:GB18030兼容GBK,且是国家强制标准),再在该终端下启动eclipse。看项目属性里已经支持GB18030了,不过好像乱码问题还是有呢。后来想到Ubuntu默认下是没有GB18030和GBK的本地locale的,所以为了设置locale为zh_CN.GB18030,我们需要先为glib产生GB18030和GBK编码的支持。 
下面红色部分内容是转自ubuntu forum
ubuntu中文化指南 

前言:下面的文字只是针对采用zh_CN.GBxxx作为locale的untuntu系统进行的设置指南。 
发现最近几天又有人问这个问题了,下面的方法我查了半天的资料,花了很多功 夫,总算是有了这个方法,因为我个人对utf8确实没什么好感(这一点就不要争 论了,个人印象如此,改不了了),所以和大家分享一下(其实我很懒,打了这么多字,不容易啊),这个帖子前几天发的,可能有人没看到,编辑一下再顶起来, 希望需要的人可以看到,说实在的,网上关于linux设置中文locale的方法,都比较笼统,用起来总有这样那样的问题,希望这篇文章可以对你有帮助。 

注:linux文件系统的一些概念,linux的文件系统的文件名是基于字 节流的,也就是说文件名的编码以byte为单位读取的,所以文件名可以是多字节 编码方案,比如gb18030, utf8,不能是宽字节编码,比如如windows使用的utf16。所以只要是多字编码方案的文件名,linux都是可以读取的。 

1)为glib的国际化支持产生国标编码支持,ubuntu系统默认状态下是没有GB18030和GBK的本地locale的,所以为了设置locale为zh_CN.GB18030,我们需要先为glib产生GB18030和GBK编码的支持。 
1、首先设置sudo vi /var/lib/locales/supported.d/local 

添加一行 zh_CN.GBK GBK和zh_CN.GB18030 GB18030 

2、sudo locale-gen 
3、重启之后,在登录窗口的选项里面就可以选择中文(GB18030)了。 
4、进入系统后,终端的默认编码已经是GB18030了,可以在终端中创建中文文件名的文件试试看,比如touch 中文,再ls显示看看。 

2) 作为ubuntu重要组成部分的gnome是基于glib库的,在glib的函数里,默认读写文件名的编码选项是utf8,所以使用gtk或 是gnome程序创建的中文文件名仍然是uft8编码的,可以通过下面的方法验证,在nautilus中进入/home/用户文件夹,右键创建文件夹,取 一个中文名字,在终端中ls显示,会发现这个文件夹是乱码,将终端的编码切换为uft8,发现至少可以部分正常显示,说明文件夹的编码是uft8。其实 glib提供了两个宏,只要正确的设置,就可以告诉gnome程序,用户要读取的文件名的编码是哪一种多字编码方案,那么文件函数完全可以采用 gb18030的编码。 

使用gdm启动Gnome的写入用户主目录的.profile文件,当gnome启动后,会读取这个文件里面的设置。 
添加以下内容: 
export G_FILENAME_ENCODING=GB18030 
export G_BROKEN_FILENAMES=1 
这是告诉使用了glibc的程序,系统文件名的默认编码是gb18030,重启后,再用上面的方法实验,会发现终端里面和nautilus中显示的文件名已经是一致的了。 

经过上面两步的设置,系统的工作环境就是gb18030了,可以很好的用中文工作,哪怕是编写脚本,只要保存编码改成gb18030就没问题,哪怕是grep之类的命令,gb18030都可以很好的支持,使用中文的正则表达式除外。 

3)fat32分区的挂载,将locale改成zh_CN.GB18030之后,会发现挂载的分区中文文件都显示乱码,这是因为ubuntu自动挂载分区时采用的参数是uft8,所以要重新修改挂载的参数。 
sudo gedit /etc/fstab 
比如c盘的挂载参数是类似于这样 
UUID=466A-E277 /media/sda1 vfat defaults,utf8,umask=007,gid=46 0 1 
将utf8用codepage=936,iocharset=cp936代替,变成 
UUID=466A-E277 /media/sda1 vfat defaults,codepage=936,iocharset=cp936,umask=007,gid=46 0 1 
参数的含义可以用man mount查看(懒得打字了)其他fat32分区的挂载参数也同样修改。 
重启之后发现分区显示也正常了。 
因为我没用ntfs分区,所以nfts分区的挂载方法请用man mount自己查看。 

gb18030环境下有问题的程序和解决方法。 
其实如果是基于规范的glibc函数编程的话,gb18030应该不会有什么问题。 
1. mplayer 
安装版的mplayer的打开文件的功能是看不见windows挂载分区上的中文文件的,不过可以在浏览器里面直接双击打开,算是不是问题的问题吧。如果要编译源文件的话,根据有的说明要暂时将locale改成utf8,编译后再改回来就可以了。 

2.ubuntu自带的归档管理器和7zip软件在gb18030的环境下,读写中文文件名的文件是有问题的,解决方法是安装rar,它是基于命令行的方式,对zh_cn.gb18030支持很好,如果嫌麻烦的话,好象可以编写nautilus的脚本的,可以向windows中一样右键解压或是压缩,不过俺不会,有人会的话可不可以提供个脚本? 

按上面设置完后Eclipse对GB18030支持就正常了,且不会用乱码问题了。但是这样每次都去输入命令是不是很麻烦了,解决有三个方法:
一。更改系统编码为GB18030,我不推荐这种方式,UTF-8在Linux平台上是一种趋势,很多软件将只支持UTF-8,这样不利于使用。
二。编写一个shell,双击执行。
#!/bin/sh
export LANG=zh_CNGB18030

http://chenxj007.spaces.live.com/blog/cns!42351CFF151F6D05!167.entry
Ubuntu下修改系统默认语言为简体中文

1.首先要安装中文的支持,安装:language-selector,language-env,language-pack-zh包,运行:sudo apt-get install language-selector language-env language-pack-zh。
2.然后使安装生效,配置区域,运行:dpkg-reconfigure locales
Generating locales...
en_US.UTF-8... done
zh_CN.UTF-8... up-to-date
zh_HK.UTF-8... up-to-date
zh_SG.UTF-8... up-to-date
zh_TW.UTF-8... up-to-date
Generation complete.
Current default timezone: 'US/Eastern'.
(可运行:tzconfig修改时区)
3.设定locale,将本地默认语言改为中文(zh_CN.UTF-8),设定locale就是设定12大类的locale分类属性,即12个LC_*。除了这12个变量可以设定以外,为了简便起见,还有两个变量:LC_ALL和LANG。它们之间有一个优先级的关系:LC_ALL>LC_*>LANG。我们只要设定LC_ALL=zh_CN.UTF-8,不管LC_*和LANG设定成什么值,它们都会被强制服从LC_ALL的设定,成为 zh_CN.UTF-8。

支持GB18030、GBK和GB2312编码
1. 配置系统环境
执行 sudo vi /var/lib/locales/supported.d/zh (or /var/lib/locales/supported.d/local)
加入以下配置参数
zh_CN.GB18030 GB18030 (最新汉字编码字符集,向下兼容GBK,GB2312)
zh_CN.GBK GBK (汉字扩展编码,向下兼容GB2312, 并包含BIG5全部汉字)
zh_CN.GB2312 GB2312 (简化汉字编码字符集, 最近有客户要我们改进GB2312,太看得起我们了,我只能说:"NO!")
zh_CN.GB18031 GB18031 (数字键盘汉字编码输入,面向手持设备。maybe用Google Android SDK的大侠们需要这个)
zh_HK.BIG5 BIG5 (繁体)
zh_TW.BIG5 BIG5 (繁体)

2.然后执行 sudo locale-gen ,生成locale(自动保存在/usr/lib/locale/中)。
提示以下信息,成功了
Generating locales...
  en_US.UTF-8... done
  zh_CN.GB18030... done
  zh_CN.GB2312... done
  zh_CN.GBK... done
  zh_CN.UTF-8... up-to-date
  zh_HK.UTF-8... up-to-date
  zh_SG.UTF-8... up-to-date
  zh_TW.UTF-8... up-to-date
Generation complete.

3.注意修改一些文件:
/etc/profile:
export LC_ALL="zh_CN.GB18030"

/etc/default/locale:
#LANG="zh_CN.UTF-8"
#LANGUAGE="zh_CN:zh"
LC_ALL="zh_CN.GB18030"
LANG="zh_CN.GB18030"
LANGUAGE="zh_CN.GB18030:zh_CN.GB2312:zh_CN"
SUPPORTED="zh_CN.GB18030:zh_CN:zh:en_US.UTF-8:en_US:en"
SYSFONT="lat0-sun16"
SYSFONTACM="8859-15"

以及用户自己的profile等。

关于文件名的乱码:
作为ubuntu重要组成部分的gnome是基于glib库的,在glib的函数里,默认读写文件名的编码选项是utf8,所以使用gtk或是gnome程序创建的中文文件名仍然是uft8编码的,可以通过下面的方法验证,在nautilus中进入/home/用户文件夹,右键创建文件夹,取一个中文名字,在终端中ls显示,会发现这个文件夹是乱码,将终端的编码切换为uft8,发现至少可以部分正常显示,说明文件夹的编码是uft8。其实glib提供了两个宏,只要正确的设置,就可以告诉gnome程序,用户要读取的文件名的编码是哪一种多字编码方案,那么文件函数完全可以采用gb18030的编码。 
使用gdm启动Gnome的写入用户主目录的.profile文件,当gnome启动后,会读取这个文件里面的设置。 
添加以下内容: 
export G_FILENAME_ENCODING=GB18030 
export G_BROKEN_FILENAMES=1 
这是告诉使用了glibc的程序,系统文件名的默认编码是gb18030,重启后,再用上面的方法实验,会发现终端里面和nautilus中显示的文件名已经是一致的了。

Ubuntu下默认文件编码是utf-8的,一般的编辑器也都支持gbk,gb2312编码,但有些时候还是需要把文档从默认的gbk格式转换成utf-8格式的,比如网上下载的电子书在手机上看会出现半个字,转成utf-8就没这个问题了。

一般转换编码都是用iconv命令来转换,命令格式如下

$iconv -f gb18030 -t utf-8 file1.txt > file2.txt

说实话这个命令不好使,一方面容易重复转换,另一方面不支持通配符,无法成批转换,文件少了还好说,要是一大堆文件岂不是要累死?

于是在google上淘宝,淘得一个更好的傻瓜型命令行工具enca,它不但能智能的识别文件的编码,而且还支持成批转换。

1.安装

$sudo apt-get install enca

2.转换

命令格式如下

$enca -L 当前语言 -x 目标编码 文件名

例如要把当前目录下的所有文件都转成utf-8

$enca -L zh_CN -x utf-8 *

很简单吧。

不过用的时候发现有一部分文件无法传转,具体原因不祥,不过enca会把无法转换的文件告诉你的。对于这些不能转的文件,可以用gedit另存为的方式转,虽然这法笨点,但挺好使的。

Ubuntu 中文编码设置
  今天开始把工作环境全部迁移到Linux,一天下来,算平静。很庆幸当初在win下面用了Mozilla Thunderbird邮件客户端,而不是OutLook,这简直太方便了,可以直接把上百兆的邮件存放目录复制到linux下直接用,与之形成鲜明对比的是微软的新版live Messager,今天发现微软的这个东西甚至不支持安装在他们自己的WinXP 64/Wind2003/2008上面?我没有什么可说的呢。


     Ubuntu 默认采用UTF8编码,可以方便global。但对中文支持,还不细致,即便默认采用中文安装,也并不会自动添加GB*等支持,致使在Ubuntu下访问部分Win文本文件时,出现乱码。

I. 配置系统环境
    执行 sudo vi /var/lib/locales/supported.d/zh
    加入以下配置参数

    zh_CN.GB18030 GB18030 (最新汉字编码字符集,向下兼容GBK,GB2312)
    zh_CN.GBK GBK (汉字扩展编码,向下兼容GB2312, 并包含BIG5全部汉字)
    zh_CN.GB2312 GB2312 (简化汉字编码字符集, 最近有客户要我们改进GB2312,太看得起我们了,我只能说:"NO!")
    zh_CN.GB18031 GB18031 (数字键盘汉字编码输入,面向手持设备,我的Nokia3120从来就是发短信,接听电话,无法和PC通讯,就不用这个了。     maybe用Google Android SDK的大侠们需要这个)
    zh_HK.BIG5 BIG5 (繁体)
    zh_TW.BIG5 BIG5 (繁体)

    然后执行 sudo locale-gen 
    提示以下信息,成功了
    zh_CN.GB18030... done
    zh_CN.GBK... done
    ......

II. 系统环境支持GB*内码了,但用vi, gedit等工具访问文件还会继续乱码,需要针对不同的工具分别配置,使之自己检测支持范围内的编码
e.g. vi
    执行 sudo vi /etc/vim/vimrc 
    加入以下配置参数
    let &termencoding=&encoding
    set fileencodings=utf-8,gb18030,gbk,gb2312,big5

e.g. gedit
    执行 sudo gconf-editor
    选择 apps/gedit-2/preferences/encodings
    找到 auto_detected 编辑,在Values中分别加入 GB18030,GBK,GB2312,BIG5

    OK~

感谢lec的支援。 
    enca工具很方便,用于检测文件内码(前提是系统环境支持,如,环境不支持BIG5,是无法检测的,这个晕了我许久)
    安装 sudo apt-get install enca
    用法 enca filename 
    这个工具是在google搜索到的(http://blog.oolec.com/?p=79),绕了地球一圈才找到,猛发现文章作者就坐在我旁边,以后再找东西先问问,别瞎跑。 


Ubuntu中文指南
阅读(2799) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~