ubuntu系统下中文名乱码的问题
问题的发现,从windows上拷贝过来的文件,到了ubuntu上,java程序始终加载失败,直接在界面上一切正常,不过在终端查看,发现了问题,发现了乱码。
注意:关于从windows上拷贝文件到linux上,如果是解压过程出现的乱码,考虑解压命令中增加指定字符集的参数,比如:unzip -O CP936 ./****.zip。这部分内容不扩展,回归本次的主题:关于ubuntu系统的语言环境设置。
流程:
一、在终端查看中文文件或文件夹:
发现是否存在乱码;
二、在终端查看此时的语言环境:
使用命令locale:
三、把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有关的变量的默认值