python2、3的文本及终端显示的中文编解码问题

1、python2和python3的中文编解码有很大的不同,其中python2的字符串str类型和Unicode类型是不同的,而python3的str字符串类型和unicode是相同的,因此操作会有不同。

2、终端显示中文的问题:终端显示中文需要知道sys和locale的默认编码设置,windows和linux系统对应的是不同的,一般windows稍微sys.getdefaultencoding会得到ascii,而linux一般会得到utf-8,当然这些可能也会因为设置而改变;windows的locale默认编码一般是cp396,cp396是gbk编码的别名,linux的locale默认utf-8,注意locale编码的不同,会影响终端的显示;

https://www.cnblogs.com/hushaojun/p/10421773.html

https://blog.csdn.net/ljt735029684/article/details/80403041

https://www.cnblogs.com/juandx/p/6588795.html

例如终端上a='中文',locale是gbk的可以直接print和print(a.decode('gbk'))都可以输出中文,其中type(a)是str类型,type(a.decode('gbk'))是unicode类型,sr和unicode类型的中文可以直接print;locale是utf-8的也可以直接print或者print(a.decode('utf-8'));其中这里的decode作用是根据locale默认编码的不同而不同,会将申请的str类型的a转成终端默认的unicode然后print(https://www.cnblogs.com/chillytao-suiyuan/p/9825627.html),同样unicode可以根据locale的不同encode转成终端辨认的str类型。

https://www.v2ex.com/t/354955

其中unicode类型非常重要,因此unicode是各种类型转换的中间过渡类型,如str转utf-8,可以先将str转成unicode,然后再转成utf-8,其他类型转换也是;unicode类型还有一大用处,比如将'中文'分成'中',‘文’两个文字,需要‘中文‘是unicode类型才行,只有unicode类型才能直接分成这种形式,具体的可以这么做,假设locale是’gbk‘,设a=’中文‘,则a默认str类型,先a.decode('gbk')转成unicode类型,然后c=[i for i in a.decode('gbk')],则c就是['中',’文‘],同样比较两个中文文字是否相同,必须将比较的两个中文用同一个编码后再比较,即unicode和unicode比较,str就和str类型的中文文字比较。当然python3的str和unicode相同,所以python3可以str中文类型和unicode中文类型直接比较。

str转unicode可以两种方式:

https://segmentfault.com/q/1010000011783975

https://www.cnblogs.com/yes5144/p/11523516.html

https://blog.csdn.net/huludan/article/details/59518325---这种方式貌似没什么用

a=’中国‘,a是str类型,假设locale是’gbk‘,例如windows下,

第一种:则b=a.decode('gbk')

第二种:b=unicode(a,'gbk')

 

查看默认编码命令如下链接:

https://www.jb51.net/article/67265.htm

https://www.cnblogs.com/bestween/p/11186988.html

https://blog.csdn.net/Hai_peng_yu/article/details/86680869

https://blog.csdn.net/sdulsj/article/details/78931317

3、xml和txt文件的中文读取:python2的txt文件中文写入时,正常open,但是写入中文是可以encode,比如写入'中国',可以打开文件f,然后f.write(’中国‘.encode('utf8'))或者gbk都行,只要在读取相应的txt是用同一个解码即可,例如gbk写入的txt,读取可以char_dict = {num : char.strip().decode('gbk','ignore') for num, char in enumerate(file.readlines())};xml中文写入一般是str('中国'),读取时直接读取,然后直接分词,own_charater_all = [own_character for str in annotations_s['string_infos'] for own_character in str];

python3可以在open打开txt或者xml文件并写入时,用open(文件路径,'w+', encoding='utf8'),用encoding指定写入类型,python2无法用这种指定方式。

注意:

https://www.jianshu.com/p/8a699a17dcf1--精读

https://www.cnblogs.com/pyxiaomangshe/p/7837380.html---精读

https://segmentfault.com/a/1190000016753789

python2.7中编码总是出现问题的原因

python2中, 从文件txt读进来的字符串,或者我们自己输入的字符串都是内存中对应一定的编码(比如ascii,utf-8)后的str类型,str.decode("utf-8")之后才是unicode类型 , unicode又可以编码成各种类型。

python3 中,文件读进来和输入的字符串一开始都是unicode类型的字符串,具体在内存中的编码方式,由程序员自己设置,当然默认是utf-8编码。这种处理方式更符合人的直觉。

理清楚了这个过程处理python2、3中的编码问题就不是问题了。

4、代码的前几行# -*- coding:UTF-8 -*-又是说明当前code文件的编码格式,有了这句说明,中文注释就可以正常显示,否则出错或者显示不正确,当然如果默认就是utf-8,则没什么影响。

5、在image上打中文标签:需要decode,例如

    ##python2不加decode,在图片上显示的是乱码,其中strs是str类型,python3不需要decode,只要参数是unicode类型即可,python3的str就是unicode,python2需要根据相应的默认编码将str转成unicode。

    draw.text(local, strs.decode('utf8'), colour, font=font)

6、a='中文',a是str类型;a=u'中文',a是unicode类型。

7、总之,python3的编码问题远少于python2.

8、linux下运行ocr任务时经常会报错asciII canot....range(128)这种问题,就是编解码的问题,可以在运行python命令之前,输入export LANG='C.UTF-8',就是修改linux的编解码,就可以正常输出中文了

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值