在Linux下,你有没有这样的经历,文本文件里面的汉字显示都是正常的,可一插到数据库里就变成了乱码;文件名在本机显示都很正常,一传到服务器上显示的都变成乱码了,最近就差点被这个问题搞死,最后还算小有收获,这里写一下心得:
1
,首先要知道文件自己的编码方式
,就是文件是以
utf8
还是以
gbk
等编码方式存储的,因为这是根本。以
xxx
.
dat
文件为例
用
vi
命令打开
xxx
.
dat
文件
在命令行模式:输入
set fileencoding
这时会在终端的底部显示文件的编码方式,显示的结果如果是
cp936
(等同于
gbk
)或者
utf8
等,那说明文件的编码方式已经被正确判断出来了,如果是
latin1
,我们就可能要设定
VI
的
fileencodings
这个环境变量的值,打开
vimrc
这个文件,
RHEL
的这个文件在
/etc
目录下、
Ubuntu
在
/etc/vim
目录下;或者你也可以建一个~
/
.
vimrc
文件
然后把里面
merge
成:
set fileencodings
=
ucs
-
bom
,
utf
-
8
,
cp936
,
gb18030
,
big5
,
euc
-
jp
,
euc
-
kr
,
latin1
然后重新
vi xxx
.
dat
PS
:我们打开文件的时候,
VIM
按顺序使用
fileencodings
中的编码进行尝试解码,
如果成功的话,
就使用该编码方式进行解码,
并将
fileencoding
设置为这个值,
如果失败的话,
就继续试验下一个编码。而
latin1
是一种非常宽松的编码方式,
任何一种编码方式得到的文本,
用
latin1
进行解码,
都不会发生解码失败
——
当然,
解码得到的结果自然也就是理所当然的“乱码”
2
,下一个比较重要的就是
LANG
这个环境变量了
(关于这个变量的含义和作用自己百度,可以搜出一堆)
假如
xxx
.
dat
是以
utf8
编码,往数据库里插的时候,我们就需要把
LANG
这个环境变量设成
LANG
=
zh_CN
.
utf8
,如果
xxx
.
dat
是以
cp936
、
LANG
就需要设成
LANG
=
zh_CN
.
gbk
这样在插入的时候,就不需要用程序对文件的字符进行转换,可以直接插入
PS
:用
locale
-
a
命令查看可以把
LANG
设成哪些值,
locale
-
m
查看系统支持哪些字符集,假如
locale
-
a
没有你所需要的值,比如
zh_CN
.
gbk
,那就需要手动安装,安装方法也很简单
a
.
sudo cp /var/lib/locales/supported
.
d/local /var/lib/locales/supported
.
d/local
.
old
【可选,备份】
b
.
sudo cp /usr/share/i18n/SUPPORTED /var/lib/locales/supported
.
d/local
编辑
/var/lib/locales/supported
.
d/local
去掉大多数不用的行(
locales
)
c
.
sudo dpkg
-
reconfigure locales
编辑
/etc/environment
文件,设置一下要用的
LANG
也可以用
locale
-
gen
命令设置默认的
locale
,如
sudo locale
-
gen zh_CN
.
UTF
-
8
3
,还有一个同事,
LANG
环境变量(这里要注意环境变量生效的范围)也已经改过了,把
windows
的文件重新传到了
Linux
服务器上,通过网页浏览,文件名仍然是乱码,这是因为
LANG
还未在
apache
服务器上生效,重启一下apache服务就可以了。