问题描述:通过 secureCRT 通过 ls 命令查看目录下中文文件命及中文内容时乱码
系统:通过# cat /etc/issue 查看版本
Debian GNU/Linux 6.0 \n \l
说明:我的所有操作均在终端下操作
#su root
首先安装 locales
#apt-get install locales
然后重新选择字符编码
#dpkg - reconfigure locales
把所有 zh 开头的用空格选择,用 tab 键切换到 OK.
debian 里没有~/.bash_profile 所以需要在~/.bashrc 里面最下面加入 export LC_ALL=zh_CN.UTF-8
#reboot
重启后通过
#locale 就可以查看到所有的 LC * 都是中文编码了.
如果在 secureCRT 依然是乱码 那么就在菜单上选择
选项 --- 会话选项 -- 外观 -- 字符编码选择(UTF-8)
选项 --- 会话选项 -- 外观 -- 字体(新宋体)
通过以上对 linux 及 secureCRT 的设置,就可以解决中文乱码问题,至少我是这么解决的.
最后放入我所查阅过的资料备份,如果上面已解决可以无视.
下载安装字符
apt - get install xfonts - wqy ttf - wqy - zenhei ttf - wqy - microhei
locale 的设定及其 LANG,LC_ALL,LANGUAGE 环境变量的区别(很有用)
例如 zh_CN.GB2312,zh_CN.GB18030 或者 zh_CN.UTF-8.很多人都不明白这些古里古怪的表达方式.这个外星表达式规定了什么东西呢?这个问题稍后详述,现在只需要知道,这是 locale 的表达方式就可以了.
locale 这个单词中文翻译成地区或者地域,其实这个单词包含的意义要宽泛很多.Locale 是根据计算机用户所使用的语言,所在国家或者地区,以及当地的文化传统所定义的一个软件运行时的语言环境.
[oracle@game ~]$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8
[oracle@game ~]$
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).
所以说,locale 就是某一个地域内的人们的语言习惯和文化传统和生活习惯.一个地区的 locale 就是根据这几大类的习惯定义的,这些 locale 定义文件放在 / usr/share/i18n/locales 目录下面,例如 en_US, zh_CN and de_DE@euro 都是 locale 的定义文件,这些文件都是用文本格式书写的,你可以用写字板打开,看看里边的内容,当然出了有限的注释以外,大部分东西可能你都看不懂,因为是用的 Unicode 的字符索引方式.
[oracle@game ~]$ cd /usr/share/i18n/locales
[oracle@game locales]$ ls
aa_DJ ar_YE el_GR es_ES fr_CH iso14651_t1 ne_NP so_ET translit_hangul
aa_ER az_AZ el_GR@euro es_ES@euro fr_FR it_CH nl_BE so_KE translit_narrow
aa_ER@saaho be_BY en_AU es_GT fr_FR@euro it_IT nl_BE@euro so_SO translit_neutral
aa_ET bg_BG en_BW es_HN fr_LU it_IT@euro nl_NL sq_AL translit_small
af_ZA bn_BD en_CA es_MX fr_LU@euro iw_IL nl_NL@euro sr_CS translit_wide
am_ET bn_IN en_DK es_NI ga_IE ja_JP nn_NO st_ZA tr_TR
an_ES br_FR en_GB es_PA ga_IE@euro ka_GE no_NO sv_FI tt_RU
ar_AE br_FR@euro en_HK es_PE gd_GB kk_KZ oc_FR sv_FI@euro uk_UA
ar_BH bs_BA en_IE es_PR gez_ER kl_GL om_ET sv_SE ur_PK
ar_DZ byn_ER en_IE@euro es_PY gez_ER@abegede kn_IN om_KE ta_IN uz_UZ
ar_EG ca_ES en_IN es_SV gez_ET ko_KR pa_IN te_IN uz_UZ@cyrillic
ar_IN ca_ES@euro en_NZ es_US gez_ET@abegede kw_GB pl_PL tg_TJ vi_VN
ar_IQ cs_CZ en_PH es_UY gl_ES lg_UG POSIX th_TH wa_BE
ar_JO cy_GB en_SG es_VE gl_ES@euro lo_LA pt_BR ti_ER wa_BE@euro
ar_KW da_DK en_US et_EE gu_IN lt_LT pt_PT ti_ET wal_ET
ar_LB de_AT en_ZA eu_ES gv_GB lv_LV pt_PT@euro tig_ER xh_ZA
ar_LY de_AT@euro en_ZW eu_ES@euro he_IL mi_NZ ro_RO tl_PH yi_US
ar_MA de_BE es_AR fa_IR hi_IN mk_MK ru_RU translit_circle zh_CN
ar_OM de_BE@euro es_BO fi_FI hr_HR ml_IN ru_UA translit_cjk_compat zh_HK
ar_QA de_CH es_CL fi_FI@euro hu_HU mn_MN se_NO translit_cjk_variants zh_SG
ar_SA de_DE es_CO fo_FO hy_AM mr_IN sid_ET translit_combining zh_TW
ar_SD de_DE@euro es_CR fr_BE i18n ms_MY sk_SK translit_compat zu_ZA
ar_SY de_LU es_DO fr_BE@euro id_ID mt_MT sl_SI translit_font
ar_TN de_LU@euro es_EC fr_CA is_IS nb_NO so_DJ translit_fraction
[oracle@game locales]$
对于 de_DE@euro 的一点说明,@后边是修正项,也就是说你可以看到两个德国的 locale:/usr/share/i18n/locales/de_DE@euro 和 / usr/share/i18n/locales/de_DE.打开这两个 locale 定义,你就会知道它们的差别在于 de_DE@euro 使用的是欧洲的排序,比较和缩进习惯,而 de_DE 用的是德国的标准习惯.
上面我们说到了 zh_CN.GB18030 的前半部分,后半部分是什么呢?大部分 Linux 用户都知道是系统采用的字符集.
zh_CN.GB2312 到底是在说什么? Locale 是软件在运行时的语言环境, 它包括语言 (Language), 地域 (Territory) 和字符集 (Codeset).一个 locale 的书写格式为: 语言 [_地域 [. 字符集]].所以说呢,locale 总是和一定的字符集相联系的.下面举几个例子:
1,我说中文,身处中华人民共和国,使用国标 2312 字符集来表达字符.zh_CN.GB2312=中文_中华人民共和国+国标 2312 字符集.
2,我说中文,身处中华人民共和国,使用国标 18030 字符集来表达字符.zh_CN.GB18030=中文_中华人民共和国+国标 18030 字符集.
3,我说中文,身处中华人民共和国台湾省,使用国标 Big5 字符集来表达字符.zh_TW.BIG5 = 中文_台湾. 大五码字符集
4,我说英文,身处大不列颠,使用 ISO-8859-1 字符集来表达字符. en_GB.ISO-8859-1 = 英文_大不列颠. ISO-8859-1 字符集
5,我说德语,身处德国,使用 UTF-8 字符集,习惯了欧洲风格.-8 字符集 @按照欧洲习惯加以修正,注意不是 - 8,所以完全的 locale 表达方式是 [语言 [_地域][. 字符集] [@修正值].
其中,与中文输入关系最密切的就是 LC_CTYPE,LC_CTYPE 规定了系统内有效的字符以及这些字符的分类,诸如什么是大写字母,小写字母,大小写转换,标点符号,可打印字符和其他的字符属性等方面.而 locale 定 义 zh_CN 中最最重要的一项就是定义了汉字 (Class"hanzi") 这一个大类,当然也是用 Unicode 描述的,这就让中文字符在 Linux 系统中成为合法的有效字符,而且不论它们是用什么字符集编码的.
怎样设定 locale 呢?
设定 locale 就是设定 12 大类的 locale 分类属性,即 12 个 LC_*.除了这 12 个变量可以设定以外,为了简便起见,还有两个变量:LC_ALL 和 LANG.它们之间有一个优先级的关系:LC_ALL > LC_* >LANG.可以这么说,LC_ALL 是最上级设定或者强制设定,而 LANG 是默认设定值.
1,如果你设定了 LC_ALL=zh_CN.UTF-8,那么不管 LC_* 和 LANG 设定成什么值,它们都会被强制服从 LC_ALL 的设定,成为 zh_CN.UTF-8.
2,假如你设定了 LANG=zh_CN.UTF-8,而其他的 LC_*=en_US.UTF-8,并且没有设定 LC_ALL 的话,那么系统的 locale 设定以 LC_*=en_US.UTF-8.
3,假如你设定了 LANG=zh_CN.UTF-8,而其他的 LC_*,和 LC_ALL 均未设定的话,系统会将 LC_* 设定成默认值,也就是 LANG 的值 zh_CN.UTF-8.
4,假如你设定了 LANG=zh_CN.UTF-8,而其他的 LC_CTYPE=en_US.UTF-8,其他的 LC_*,和 LC_ALL 均未设定的话,那么系统的 locale 设定将是:LC_CTYPE=en_US.UTF-8,其余的 LC_COLLATE,LC_MESSAGES 等等均会采用默认值,也就是 LANG 的值,也就是 LC_COLLATE=LC_MESSAGES=......= LC_PAPER=LANG=zh_CN.UTF-8.
所以,locale 是这样设定的:
1,如果你需要一个纯中文的系统的话,设定 LC_ALL= zh_CN.XXXX,或者 LANG=zh_CN.XXXX 都可以,当然你可以两个都设定,但正如上面所讲,LC_ALL 的值将覆盖所有其他的 locale 设定,不要作无用功.
2,如果你只想要一个可以输入中文的环境,而保持菜单,标题,系统信息等等为英文界面,那么只需要设定 LC_CTYPE=zh_CN.XXXX,LANG=en_US.XXXX 就可以了.这样 LC_CTYPE=zh_CN.XXXX,而 LC_COLLATE=LC_MESSAGES=......= LC_PAPER=LANG=en_US.XXXX.
3,假如你高兴的话,可以把 12 个 LC_* 一一设定成你需要的值,打造一个古灵精怪的系统: LC_CTYPE=zh_CN.GBK/GBK(使用中文编码内码 GBK 字符集); LC_NUMERIC=en_GB.ISO-8859-1(使用大不列颠的数字系统) LC_MEASUREMEN=de_DE@euro.ISO-8859-15(德国的度量衡使用 ISO-8859-15 字符集) 罗马的地址书写方式,美国的纸张设定.......估计没人这么干吧.
4,假如你什么也不做的话,也就是 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 有关的变量的默认值,
refer: http: //blog.chinaunix.net/u2/60913/showart_1161340.html
.bash_profile 和. bashrc 的区别 (如何设置生效)
/etc/profile: 此文件为系统的每个用户设置环境信息, 当用户第一次登录时, 该文件被执行.
并从 / etc/profile.d 目录的配置文件中搜集 shell 的设置.
/etc/bashrc: 为每一个运行 bash shell 的用户执行此文件. 当 bash shell 被打开时, 该文件被读取.
~/.bash_profile: 每个用户都可使用该文件输入专用于自己使用的 shell 信息, 当用户登录时, 该
文件仅仅执行一次! 默认情况下, 他设置一些环境变量, 执行用户的. bashrc 文件.
~/.bashrc: 该文件包含专用于你的 bash shell 的 bash 信息, 当登录时以及每次打开新的 shell 时, 该
该文件被读取.
~/.bash_logout: 当每次退出系统 (退出 bash shell) 时, 执行该文件.
另外,/etc/profile 中设定的变量 (全局) 的可以作用于任何用户, 而~/.bashrc 等中设定的变量 (局部) 只能继承 / etc/profile 中的变量, 他们是 "父子" 关系.
~/.bash_profile 是交互式,login 方式进入 bash 运行的
~/.bashrc 是交互式 non-login 方式进入 bash 运行的
通常二者设置大致相同,所以通常前者会调用后者.
设置生效:可以重启生效,也可以使用命令:source
alias php=/var/eyouim/pub/php/bin/php
source /etc/profile
操作步骤
以下两步:
远程 linux 机器.修改环境变量 LANG.例如在~/.bash_profile 里面添加
[plain]
export LANG=zh_CN.UTF8
重新登录之后生效.
现在查看一下当前设置:
[plain]
myname@myhost~> locale
LANG=zh_CN.UTF8
LC_CTYPE="zh_CN.UTF8"
LC_NUMERIC="zh_CN.UTF8"
LC_TIME="zh_CN.UTF8"
LC_COLLATE="zh_CN.UTF8"
LC_MONETARY="zh_CN.UTF8"
LC_MESSAGES="zh_CN.UTF8"
LC_PAPER="zh_CN.UTF8"
LC_NAME="zh_CN.UTF8"
LC_ADDRESS="zh_CN.UTF8"
LC_TELEPHONE="zh_CN.UTF8"
LC_MEASUREMENT="zh_CN.UTF8"
LC_IDENTIFICATION="zh_CN.UTF8"
LC_ALL=
myname@myhost~>
本地 windows 机器.修改 SecureCRT 的设置.找到 "选项"->"会话选项"->"外观":
* 字符编码设置为 utf-8.
* 字体设置,选择中文字体,例如新宋体.
设置完成.然后测试一下.
基本原理
首先,同一种语言,可以使用不同的编码.例如,中文 windows 的系统默认字符集是 cp936,基本上等同 gbk.参考 .
例如有两个文件.文件名分别为 "我的分析 1.txt" 和 "我的分析 2.txt".但是文件名(不是文件内容)的编码格式不同.
"我的分析 1.txt" 的 UTF-8 编码为
[plain]
e68891 e79a84 e58886 e69e90 31 2e 74 78 74
我 的 分 析 1 . t x t
"我的分析 2.txt" 的 gb2312(是 gbk 的一个真子集)编码格式为
[plain]
ced2 b5c4 b7d6 cef6 32 2e 74 78 74
我 的 分 析 2 . t x t
第二,linux shell 环境下,环境变量 LANG 决定了本地使用的字符集(通常情况,不考虑 LC_ALL 等).包括文件名和文件内容的处理.例如,由于编码不同,运行 ls 命令时,上面的两个文件名不能同时正确显示.
在实际 linux 系统中,不应该如此灵活,而要固定一种文件名编码格式.例如,linux 一般默认使用 utf-8 编码文件名.以下三种情况:
1> LANG=zh_CN.UTF8,设置 shell 程序使用 UTF8 编码处理字符.因此,
"我的分析 1.txt" 能够被正确处理,因为是 UTF-8 编码.
"我的分析 2.txt" 是 gb2312 编码,显示为乱码.
2> LANG=zh_CN.gb2312 或者 LANG=zh_CN.gb18030,那么
"我的分析 1.txt" 显示为乱码.
"我的分析 2.txt" 能够正确处理.
3> LANG=en,那么 ls 查看,两个文件名都不能正常显示.
第三,SecureCRT 客户端的编码设置要与远程 linux 的编码设置一致,才可以正确显示字符.
补充说明
SecureCRT 和远程 linux 同时都使用 gb2312 编码,也没有问题.在这种情况下,字符都按照 gb2312 进行处理.但是,笔者在自己的 windows 上利用网络邻居查看远端的 linux samba server 时,看到的 gb2312 中文文件名是乱码.而用 UTF-8 就没有问题.尽管通过设置 samba 能够解决,但还是建议统一用默认的 UTF8 格式,比较保险.
VIM 正确显示和输入中文的设置.编辑~/.vimrc,添加下面两行 [plain]
let &termencoding=&encoding
set fileencodings=ucs-bom,utf-8,gbk
这样设置之后,utf-8 和 gb2312 都能正确处理.
查看文件编码在 Linux 中查看文件编码可以通过以下几种方式:1. 在 Vim 中可以直接查看文件编码: set fileencoding 即可显示文件编码格式.如果你只是想查看其它编码格式的文件或者想解决用 Vim 查看文件乱码的问题,那么你可以在~/.vimrc 文件中添加以下内容:set encoding=utf-8 fileencodings=ucs-bom,utf-8,cp936 这样,就可以让 vim 自动识别文件编码(可以自动识别 UTF-8 或者 GBK 编码的文件),其实就是依照 fileencodings 提供的编码列表尝试,如果没有找到合适的编码,就用 latin-1(ASCII) 编码打开.2. enca (如果你的系统中没有安装这个命令,可以用 sudo yum install -y enca 安装) 查看文件编码 $ enca filenamefilename: Universal transformation format 8 bits; UTF-8CRLF line terminators 需要说明一点的是,enca 对某些 GBK 编码的文件识别的不是很好,识别时会出现:Unrecognized encoding 文件编码转换 1. 在 Vim 中直接进行转换文件编码, 比如将一个文件转换成 utf-8 格式: set fileencoding=utf-82. enconv 转换文件编码,比如要将一个 GBK 编码的文件转换成 UTF-8 编码,操作如下 enconv -L zh_CN -x UTF-8 filename3. iconv 转换,iconv 的命令格式如下:iconv -f encoding -t encoding inputfile 比如将一个 UTF-8 编码的文件转换成 GBK 编码 iconv -f GBK -t UTF-8 file1 -o file2
查看文件编码file命令
file ip.txt ip.txt: UTF - 8 Unicode text,
with escape sequences
一,利用iconv命令进行编码转换文件内容编码转换iconv命令用于转换指定文件的编码,
默认输出到标准输出设备,
亦可指定输出文件.用法:iconv[选项...][文件...]有如下选项可用: 输入 / 输出格式规范: - f,
--from - code = 名称原始文本编码 - t,
--to - code = 名称输出编码信息: - l,
--list列举所有已知的字符集输出控制: - c从输出中忽略无效的字符 - o,
--output = FILE输出文件 - s,
--silent关闭警告--verbose打印进度信息 - ?,
--help给出该系统求助列表--usage给出简要的用法信息 - V,
--version打印程序版本号例子: iconv - f utf - 8 - t gb2312 aaa.txt > bbb.txt这个命令读取aaa.txt文件,从utf - 8编码转换为gb2312编码,
其输出定向到bbb.txt文件.
二,文件名编码转换
因为现在用linux,
原来在windows里的文件都是用GBK编码的.所以copy到linux下是乱码,文件内容可以用iconv来转换可是好多中文的文件名还是乱码,找到个可以转换文件名编码的命令,就是convmv.
例如
convmv - f GBK - t UTF - 8 * .mp3
不过这个命令不会直正的转换,你可以看到转换前后的对比.如果要直正的转换要加上参数--notest
convmv - f GBK - t UTF - 8--notest * .mp3
- f参数是指出转换前的编码, - t是转换后的编码.这个千万不要弄错了.不然可能还是乱码哦.还有一个参数很有用.就是 - r这个表示递归转换当前目录下的所有子目录.
* 需要安装convmv - 1.10 - 1.el5.noarch.rpm
来源: http://lib.csdn.net/article/linux/36322