lamp 乱码
2016-05-18 23:22
197 查看
在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服务就可以了
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服务就可以了
相关文章推荐
- (转载)一步一学Linux与Windows 共享文件Samba (v0.2b)
- 学者批教育不公阻碍穷二代向上流动 致贫者愈贫
- 大学要防止培养‘小人’
- fcntl实例
- 正则表达式口诀
- android - Genymotion 安装
- Java垃圾回收机制--入门
- Java之字符串详解
- Map接口
- hadoop SecondNamenode详解
- 用js触发CSS3-transition过渡动画
- 欢迎使用CSDN-markdown编辑器
- bashrc与profile的区别
- 如何让外网访问内网搭建的www服务器
- linux 中命令yum的用法
- man man
- 《IT人-不要一辈子靠技术生存 》
- 理解VMware虚拟机下网络连接的三种模式
- mtab的说明
- Linux禁止单用户模式(single)来增强系统安全