如何处理Linux汉字乱码

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服务就可以了

猜你喜欢

转载自lwx522.iteye.com/blog/1435361