ubuntu系统下中文名乱码的问题

问题的发现,从windows上拷贝过来的文件,到了ubuntu上,java程序始终加载失败,直接在界面上一切正常,不过在终端查看,发现了问题,发现了乱码。

注意:关于从windows上拷贝文件到linux上,如果是解压过程出现的乱码,考虑解压命令中增加指定字符集的参数,比如:unzip -O CP936 ./****.zip。这部分内容不扩展,回归本次的主题:关于ubuntu系统的语言环境设置。

流程:

一、在终端查看中文文件或文件夹:

ubuntu系统下中文名乱码的问题

发现是否存在乱码;

 

二、在终端查看此时的语言环境:

使用命令locale:

ubuntu系统下中文名乱码的问题

 

三、把LC_ALL设置为对应的语言和编码

输入命令:export LC_ALL=zh_CN.UTF-8   (根据需要或者是GBK等)

这是本终端下进行的操作,中文就不再是乱码,这是每次都需要临时设置的情况。

 

四、永久设置

根据网上的已经一些建议,进行了尝试:

在etc文件下的profile文件中,增加上面的命令,export LC_ALL=zh_CN.UTF-8。

以及在etc/default/路径下,修改locale文件的内容,把LANG和LANGUAGE的值改为适合的,增加LC_ALL=zh_CN.UTF-8等。

不过只有root用户有权限修改这些文件,所以切换到了root用户下,进行了修改。

所以结果就是只有在root用户下,每次输入locale命令,才能看到都已经修改了,切换会我的其他用户,还是必须每次手动临时修改。

有时间了再研究一些,完善这部分内容。

 

备注:locale 、 LANG、 LC_ALL相关的知识

 

一、什么是locale

    locale这个单词中文翻译成地区或者地域,其实这个单词包含的意义要宽泛很多。Locale是根据计算机用户所使用的语言,所在国家或者地区,以及当地的文化传统所定义的一个软件运行时的语言环境。

   

 上面这个解释说得好玄乎,举两个简单的例子:

    a)在“简体中文”的环境,运行df命令,第一行显示的是:

文件系统               1K-块        已用     可用 已用% 挂载点

        而在“繁体中文”的环境下,运行df命令,第一行显示的是:

檔案系統               1K-區段      已用     可用 已用% 掛載點

    b)在中文环境下运行date命令,显示的是

2013年 01月 27日 星期日 15:57:01 CST

        而在英文环境下,运行date命令,显示的是

Sun Jan 27 15:57:46 CST 2013

    看到上面两个例子,我想应该比较清楚了,不同地区对一些计算机词汇、日期显示等方面都有各自的习惯,比如*通常使用“文件系统”,而*或者香港地区则会用“檔案系統”,这显然不是简单的从简体到繁体的转换而已,所以可以想像,有一套系统在为各个地区的本地化服务。

 

在Linux中通过locale来设置程序运行的不同语言环境,locale由ANSI C提供支持。locale的命名规则为<语言>_<地区>.<字符集编码>,如zh_CN.UTF-8,zh代表中文,CN代表大陆地区,UTF-8表示字符集。

   

 locale把按照所涉及到的使用习惯的各个方面分成12个大类,这12个大类分别是: 

1、语言符号及其分类(LC_CTYPE) 

2、数字(LC_NUMERIC) 

3、比较和习惯(LC_COLLATE) 

4、时间显示格式(LC_TIME) 

5、货币单位(LC_MONETARY) 

6、信息主要是提示信息,错误信息,状态信息,标题,标签,按钮和菜单等(LC_MESSAGES) 

7、姓名书写方式(LC_NAME) 

8、地址书写方式(LC_ADDRESS) 

9、电话号码书写方式(LC_TELEPHONE) 

10、度量衡表达方式 (LC_MEASUREMENT) 

11、默认纸张尺寸大小(LC_PAPER) 

12、对locale自身包含信息的概述(LC_IDENTIFICATION)。

---------------------------------------

关于LANG
LANG是LC_*的默认值,是最低级别的设置,如果LC_*没有设置,则使用该值。类似于 LC_ALL。

关于LC_ALL
它是一个宏,如果该值设置了,则该值会覆盖所有LC_*的设置值。注意,LANG的值不受该宏影响。

"C"是系统默认的locale,"POSIX"是"C"的别名。所以当我们新安装完一个系统时,默认的locale就是C或POSIX。

 

locale的设定:   
LC_ALL和LANG优先级的关系: LC_ALL > LC_* >LANG   
1、如果需要一个纯中文的系统的话,设定LC_ALL= zh_CN.XXXX,或者LANG=zh_CN.XXXX都可以。  
2、如果只想要一个可以输入中文的环境,而保持菜单、标题,系统信息等等为英文界面,那么只需要设定 LC_CTYPE=zh_CN.XXXX,LANG=en_US.XXXX就可以了。  
3、假如什么也不做的话,也就是LC_ALL,LANG和LC_*均不指定特定值的话,系统将采用POSIX作为lcoale,也就是C locale。  
LANG和LANGUAGE的区别:   
LANG - Specifies the default locale for all unset locale variables  
LANGUAGE - Most programs use this for the language of its interface  
LANGUAGE是设置应用程序的界面语言。而LANG是优先级很低的一个变量,它指定所有与locale有关的变量的默认值