linux 中文编码环境,linux中文编码问题总结

在linux上处理中文的时候,特别是自然语言这种频繁读写中文到文件的情况,经常会出错,下面梳理总结一下。常用相关编码有:文件编码,文件内容编码,终端编码,标准输入输出流编码,操作系统编码。

常出问题的是文件编码与文件内容编码,有时候这两个不一致会导致导入时,解码出错,可用vim设置:set fileencoding=xxx修改文件编码。对于批量文件编码修改,可用convmv工具(非系统自带,一般需要安装)

导致文件编码与文件内容编码不一致的原因:

在数据流写入文件时,会从fileencodings去逐个读取,如果发现某个编码能正常解析当前文件流,即当作该编码,设置文件编码为这个编码;如果没有找到合适的编码,那么文件编码就会被设置为空。在写文件的时候,经常会因为没有设置fileencodings变量,而导致文件编码为空。

解决办法是:在写入文件,如用iconv转码时,先set fileencodings=xxx,xxxx ,在操作写入文件,这能从根本上解决问题。

问题影响:文件编码和文件内容编码不一致,会导致在文件处理的时候解析异常。比如用python处理中文,读取文件时,会默认以fileencoding的编码打开,如果这个编码不对,在脚本中,要decode的时候就会挂掉,即便文件内容的编码是正确的。如:文件内容编码是utf-8,而文件编码是gb18030,python以gb18030打开文件,这时候,文件内容已经编码异常了。。然后用decode('utf-8')时,抛出UnicodeDecodeError,接着一脸蒙x。。

下面总结下常用的转码方式:

文件内容编码用iconv 转码即可,用法就是iconv -f [原编码] -t [目标编码] file -o outfile 。需要注意的时,有时候文件里会有个别编码错误的字节,导致后续内容转码失败,对这种情况,只要加上-c参数即可,也就是iconv -f [原编码] -t [目标编码] -c file -o outfile

查看文件编码,可以用file命令,加参数-bi可获得更精确的编码,但是file查看的编码经常不准确,注意此坑。对应单个的也可以用vim的encoding命令查看

操作系统编码看环境变量LANG

在用python处理文件时,统一用unicode编码处理。对于字符串,从文件读入内存时,会先按照文件编码转到标准输入流编码,所以处理中文字符串时,可用str.decode(sys.stdin.encoding)解码到Unicode,可解决中文字符串的编码问题

中文显示异常问题:

经常在用vim打开文件时,中文会乱码,导致文件乱码的一般是文件编码,文件内容编码,vim编码,iterm/scurecrt/其他终端 的编码不一致,把这三个编码修改成一样的就可以了

当然,这么复杂的工序,很多同学都蒙了,人民群众的力量是无穷的,需求就是用来解决的,这不,有个传说中的工具enca,可以智能识别编码,以及批量编码转化,具体使用,可以查找相关wiki或博客,有很多介绍。。。不。过。作为有geek基因的青年,少了折腾,心里怎么会爽,因此不用这种工具,是上策(用原始方法能更深入理解操作系统编码的原理,又能解决问题,又能涨姿势,多好~)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值