How to Set Locales (i18n) On a Linux or Unix


原文链接: How to Set Locales (i18n) On a Linux or Unix

解决Ubuntu中使用windows文件名乱码问题 – 【人人分享-人人网】
简单解决Ubuntu修改locale的问题-通信,我的最爱-51CTO博客
各种字符集和编码详解 - 快乐就好 - 博客园
十分钟搞清字符集和字符编码 - 文章 - 伯乐在线
unicode wiki
unicode 箭头符号
unicode 装饰符号 0x27xx

locale

如果要设置中文版的字体编码。在每个文件中增加以下内容。
中文版

# vim /etc/profile.d/locale.sh
export LC_CTYPE=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8

# vim /etc/locale.conf
LANG=zh_CN.UTF-8

# vim /etc/sysconfig/i18n
LANG=zh_CN.UTF-8

# vim /etc/environment
LANG=zh_CN.UTF-8
LC_ALL=zh_CN.UTF-8

英文版本

# vim /etc/profile.d/locale.sh
export LC_CTYPE=en_US.UTF-8
export LC_ALL=en_US.UTF-8

# vim /etc/locale.conf
LANG=en_US.UTF-8

# vim /etc/sysconfig/i18n
LANG=en_US.UTF-8

# vim /etc/environment
LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8

Ubuntu支持Windows GBK编码

使ubuntu正常显示GB2312、GBK编码文件 思无涯
ubuntu环境设置的字符集utf8,windows默认字符集是GBK,Ubuntu的默认字符集为utf-8,这使 得在用telnet登录远程服务器或查看windows文件时出现乱码。需要将ubuntu环境设置为GBK或GB2312,或设置软件使其正确显示汉 字。下面以GBK字符集为例进行说明:

一、修改Ubuntu默认字符集为GBK
1、首先设置sudo vi /var/lib/locales/supported.d/local
添加一行 zh_CN.GBK GBK
sudo locale-gen生成locale

2、修改ubuntu的字符集
方法一: 修改用户目录下的.profile文件,增加以下内容:
LANGUAGE=”zh_CN:zh:en_US:en”
LANG=zh_CN.GBK
重新登录即可。
这个方法只对该用户有效。
方法二:修改/etc/environment,增加以下内容:
LANGUAGE=”zh_CN:zh:en_US:en”
LANG=zh_CN.GBK
然后重启X即可
这个方法对没有设置LANG及LANGUAGE环境变量的用户有效

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

编码

man -k unicode
ascii

ASCII
转义字符串(Escape Sequence)也称字符实体(Character Entity)。在HTML中,定义转义字符串的原因有两个:第一个原因是像“<”和“>”这类符号已经用来表示HTML标签,因此就不能直接当做文本中的符号来使用。为了在HTML文档中使用这些符号,就需要定义它的转义字符串。当解释程序遇到这类字符串时就把它解释为真实的字符。在输入转义字符串时,要严格遵守字母大小写的规则。第二个原因是,有些字符在ASCII字符集中没有定义,因此需要使用转义字符串来表

escape 的用法汇总

escape对除0-255以外的unicode值进行编码时输出%u****格式,
其它情况下escape,encodeURI,encodeURIComponent编码结果相同。
最多使用的应为encodeURIComponent,它是将中文、韩文等特殊字符转换成utf-8格式的url编码,所以如果给后台传递参数需要使用encodeURIComponent时需要后台解码对utf-8支持(form中的编码方式和当前页面编码方式相同)

escape(弃用)不编码字符有69个:*,+,-,.,/,@,_,0-9,a-z,A-Z
encodeURI 不编码字符有82个:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z
encodeURIComponent不编码字符有71个:!,',(,),*,-,.,_,~,0-9,a-z,A-Z

  1. escape(str) 方法,它用于转义不能用明文正确发送的任何字符。比如,电话号码中的空格将被转换成字符 %20,从而能够在 URL 中传递这些字符

escape()不能直接用于URL编码,它的真正作用是返回一个字符的Unicode编码值。比如"春节"的返回结果是%u6625%u8282 escape()不对+ - * / @ _ .编码,主要用于汉字编码,现在已经不提倡使用。

encodeURI()是Javascript中真正用来对URL编码的函数。
编码整个url地址,但对特殊含义的符号; / ? : @ & = + $ , #,也不进行编码。对应的解码函数是:decodeURI()。

encodeURIComponent()
能编码; / ? : @ & = + $ , #这些特殊字符。对应的解码函数是decodeURIComponent()。

我想要传递带&符号的网址,所以用encodeURIComponent()

  1. url 编码 [形式为 %20] 字符集可能是utf8 肯能是gbk

    
    [RFC1738 统一资源定位器(URL)](http://man.chinaunix.net/develop/rfc/RFC1738.txt)
    “`只有字母和数字[0-9a-zA-Z]、一些特殊符号“$-_.+!*'(),”[不包括双引号]、以及某些保留字,才可以不经过编码直接用于URL。`”
    2.2  URL字符编码问题
    
    如果存在下面的情况:八位字节数在US-ASCII字符集中没有相应的可显示字符,或者使
    用相应字符会产生不安全因素,或者相应的字符被保留用于特定的URL方案的解释,那
    么它们必须被编成代码。
    1. 没有相应的可显示字符:
    URL只能用US-ASCII字符编码集中的可显示字符表示。US-ASCII中没有用到十六进制的
    八位字节80-FF,并且00-1F和7F代表了控制字符,这些字符必须进行编码。
    2. 不安全:
    字符不安全的原因很多。空格字符就是不安全的,因为URL在被转录或者被排版或者被
    字处理程序处理后其中重要的空格可能被忽略,而可忽略的空格却有可能被解释了。“<”
    和“>”字符也是不安全的,因为它们被用来作为URL在文本中的分隔符;而在有些系统
    中用引号“"”来界定URL。“#”字符也是不安全的,因为它在万维网和其他一些系统中
    被用来从“片段/锚点”标志符中界定URL,所以它通常都要被编码。字符“%”被用来对
    其他字符进行编码,它也是不安全的。其他一些字符,如:
    "{", "}", "|", "\", "^", "~","[", "]",和"`"
    ,由于网关和其他传输代理有时会对这些字符进行修改,所以它们也是不安全的。
    必须对URL中所有不安全的字符进行编码。例如,URL中的字符“#”即使是在通常不处
    理片断或者锚点标志符的系统也需要进行编码,这样如果这个URL被拷贝到使用这些标
    志符的系统中,也不必改变URL编码了。
    3. 保留:
    许多URL方案保留了一些字符并赋予特定的含义:它们出现在URL的特定部位并表示特
    定的含义。如果一个字符对应的八位字节在方案中被保留了,那么这个八位字节必须进行
    编码。字符";","/", "?", ":", "@", "=" 和 "&"可能被某个方案所保留,除此之外没
    有其他的保留字符。
    通常情况下一个八位字节被用一个字符表示后或者被编码之后,URL的解释都是一样的。
    但这对于保留字符来说就不适用了:对某一特定方案的保留字符进行编码可能会改变URL
    的语义。
    这样,在URL中只有字母与数字,以及特殊字符“$-_.+!*'(),”和用作保留目的的保留
    字符可以不进行编码。
    另一方面,不必进行编码的字符(包括字母与数字)如果出现在URL的特定部位,只要
    它们不用作保留目的,则可进行编码。
    
    3. html_entity_decode
    那么HTML Entity编码具体应该做哪些事情呢?它需要对下面这6个特殊字符进行编码:
    HTML字符实体(Character Entities)
    
    有些字符在HTML里有特别的含义,比如小于号<就表示HTML Tag的开始,这个小于号是不显示在我们最终看到的网页里的。那如果我们希望在网页中显示一个小于号,该怎么办呢?
    
    这就要说到HTML字符实体(HTML Character Entities)了。
    
    一个字符实体(Character Entity)分成三部分:第一部分是一个&符号,英文叫ampersand;第二部分是实体(Entity)名字或者是#加上实体(Entity)编号;第三部分是一个分号。
    
    比如,要显示小于号,就可以写&lt;或者&#60;。
    
    用实体(Entity)名字的好处是比较好理解,一看lt,大概就猜出是less than的意思,但是其劣势在于并不是所有的浏览器都支持最新的Entity名字。而实体(Entity)编号,各种浏览器都能处理。
    
    注意:Entity是区分大小写的。
    
    如何显示空格
    
    通常情况下,HTML会自动截去多余的空格。不管你加多少空格,都被看做一个空格。比如你在两个字之间加了10个空格,HTML会截去9个空格,只保留一个。为了在网页中增加空格,你可以使用&nbsp;表示空格。
    
    最常用的字符实体(Character Entities)
    
    显示结果    说明    Entity Name    Entity Number
    
    显示一个空格    &nbsp;    &#160;
    <    小于    &lt;    &#60;
    >    大于    &gt;    &#62;
    &    &符号    &amp;    &#38;
    "    双引号    &quot;    &#34;
    
    其他常用的字符实体(Character Entities)
    
    显示结果    说明    Entity Name    Entity Number
    
    ©    版权    &copy;    &#169;
    ®    注册商标    &reg;    &#174;
    ×    乘号    &times;    &#215;
    ÷    除号    &divide;    &#247;
    

查看 4E00 - 4EFF 之间的unicode自符

unicode -x 4E00..

#查看 ascii

字符集(Charset):
ASCII字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集
字符编码(Character Encoding):
Unicode是字符集,UTF-32/ UTF-16/ UTF-8是三种字符编码方案

How to Set Locales (i18n) On a Linux or Unix
http://www.cyberciti.biz/faq/how-to-set-locales-i18n-on-a-linux-unix/
http://www.linuxfly.org/post/424/
http://blog.csdn.net/lwm_1985/article/details/8509506

  1. 添加语言支持
    sed -i 's/# zh_CN.UTF-8 UTF-8/zh_CN.UTF-8 UTF-8/' /etc/locale.gen
    sed -i 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen

  2. locale-gen和dpkg-reconfigure locales 都是根据 /etc/locale.gen 生成指定的语言
    sudo locale-gen en_US.UTF-8 |sudo locale-gen
    DEBIAN_FRONTEND=noninteractive dpkg-reconfigure locales
    Generating locales (this might take a while)...
    en_US.UTF-8... done
    zh_CN.UTF-8... done
    Generation complete.

3.
update-locale LC_ALL= "zh_CN.UTF-8"

$ cat `/etc/default/locale`
#  File generated by update-locale
LANG=zh_CN.UTF-8
LANGUAGE="zh_CN:zh"

4.
export LANG=zh_CN.UTF-8

################################################################################
Configuring Locales
The Easy Way

Install debconf (i.e. run apt-get update then apt-get install debconf, as root)
Run dpkg-reconfigure locales as root

The Hard Way

Edit /etc/locale.gen as root. If /etc/locale.gen does not exist, create it. An example /etc/locale.gen is below.
Run /usr/sbin/locale-gen as root

A sample /etc/locale.gen

This file lists locales that you wish to have built. You can find a list

of valid supported locales at /usr/share/i18n/SUPPORTED. Other

combinations are possible, but may not be well tested. If you change

this file, you need to rerun locale-gen.

#

XXX GENERATED XXX

#

NOTE!!! If you change this file by hand, and want to continue

maintaining manually, remove the above line. Otherwise, use the command

"dpkg-reconfigure locales" to manipulate this file. You can manually

change this file without affecting the use of debconf, however, since it

does read in your changes.

en_US.UTF-8 UTF-8

######
查看所有的locale语言
# locale -a
# locale -a|grep en

■ 查看当前操作系统使用的语言

# echo $LANG

■ 设置系统locale语言为中文环境(永久生效)

vi /etc/sysconfig/i18n

LANG="zh_CN.UTF-8"

■ 设置系统locale语言为英文环境(永久生效)

LANG="en_US.UTF-8"

■ 临时改变系统locale语言(退出本次登录立即失效)

# export LANG=zh_CN.UTF-8

■ 安装中文字体

# yum install fonts-chinese.noarch

■ 指定中文字体路径

vi /etc/X11/fs/config

catalogue = /usr/X11R6/lib/X11/fonts/misc:unscaled,

       /usr/X11R6/lib/X11/fonts/75dpi:unscaled,
       /usr/X11R6/lib/X11/fonts/100dpi:unscaled,
       /usr/X11R6/lib/X11/fonts/Type1,
       /usr/share/fonts/default/Type1,
       ,
       /usr/share/fonts/zh_CN/TrueType,
       /usr/share/fonts/zh_TW/TrueType

方法2

修改CentOS运行环境的默认语言环境变量值

[root@www ~]# vi /etc/profile

找到export语句,在语句前面加入

LANG=”en_US.UTF-8″

再在export后面追加LANG

export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC LANG

保存配置,修改CentOS语言完成。

`