首页 > 编程语言 >python2.X编码问题梳理

python2.X编码问题梳理

时间:2022-12-20 11:05:44浏览次数:46  
标签:编码 utf python sys unicode 字符串 梳理 python2


首先这些问题只有在python2.X版本出现,因为3.X版本中python环境就只有unicode类型的字符串了,即所有程序中处理的都会自动转换成unicode字符串。那么2.X的python程序开发中如何避免和理清编码问题呢?首先要保持一个良好的统一规则,不然一切都是白扯了,统一都用utf-8是最好的。

python中会用到编码的不同地方有:

1、python源文件的编码
2、python运行时环境的编码
3、python程序接收的外部输入字符串的编码



首先,源文件中的编码就是对文件中非英文字符的编码和保存方式,默认是用操作系统的默认编码;这个编码是由系统的locale决定的【通过systeminfo.exe可以查到】,如:locale设置为zh-CN,那么其默认编码就是ASCII码【locale.getdefaultlocale()】,所以此时源文件中有非英文字符时就会编码报错,解决办法是在源码文件头部加一行编码指定,如:# -*- coding: utf-8 -*-,这样就是指定了源文件中非英文字符的编码方式。



其次,运行时环境的编码,通过python在运行时首先获取系统locale的信息【locale.getdefaultlocale()】,如:zh-CN的默认编码是ASCII码,对于英文字符解码都正常,当遇到多字节文字,就会用文件系统的默认编码【sys.getdefaultencoding()】,zh-CN时是GBK。这就是我们通常在windows系统的命令行环境中启动python的效果,所有输入的字符串都是str类型,英文的是ascii类型,中文的则是gbk类型。同样在python中有一个unicode函数,其在解码字符串时使用的就是前面所说的一套逻辑。再来说说如何在python环境中设置编码,首先直接设置unicode字符,比如:u'中文',这样就是直接把一个字符串转换成unicode字符串,任何编码环境下输入这样的字符串其都会相应的被解码成unicode字符串;还有就是设置python运行环境编码【sys.getdefaultencoding()】,zh-CN中默认是GBK,不过我们可以修改它,这样python环境中默认的解码方式都会使用这个设置的编码,如:


import sys 
reload(sys)# Python2.5 初始化后会删除 sys.setdefaultencoding 这个方法,我们需要重新载入
sys.setdefaultencoding('utf-8')


再次,外部输入的编码,比如读取文件;内置的open()方法打开文件时,read()读取的是str,读取后需要使用正确的编码格式进行decode()。 write()写入时,如果参数是unicode,则需要使用你希望写入的编码进行encode(),如果是其他编码格式的str,则需要先用该str的编码进行decode(),转成unicode后再使用写入的编码进行encode()。如果直接将unicode作为参数传入write()方法,Python将先使用源代码文件声明的字符编码进行编码然后写入。


总结,基本上这3个环节上都使用了统一的编码,那自然就没有什么大问题,而上面的3个环节中前2个我们可以控制,第三个是和使用者有关的,不可确定但是我们可以在接收用户或者外部输入时就对其进行编码识别,并在接收字符的同时第一时间就将其解码为unicode,这样就可以尽量减少编码问题的出现了。


if s.decode('utf-8', REPLACE)==s.decode('utf-8', IGNORE):
s = s.decode('utf-8')
elseif ....
....



标签:编码,utf,python,sys,unicode,字符串,梳理,python2
From: https://blog.51cto.com/u_15918230/5954446

相关文章

  • 即时通讯音视频开发之音频基础及编码原理
    即时通讯应用中的实时音视频技术,几乎是IM开发中的最后一道高墙。原因在于:实时音视频技术=音视频处理技术+网络传输技术的横向技术应用集合体,而公共互联网不是为了实时......
  • 【机器学习】李宏毅——AE自编码器(Auto-encoder)
    1、What在自编码器中,有两个神经网络,分别为Encoder和Decoder,其任务分别是:Encoder:将读入的原始数据(图像、文字等)转换为一个向量Decoder:将上述的向量还原成原始数据的形式......
  • django之Q查询进阶、ORM查询优化、ORM事务、ORM常用字段类型和字段参数、Ajax介绍、数
    一、Q查询进阶操作这里主要就是让查询数据的时候,可以使用input获取的信息,进行用户交互。fromdjango.db.modelsimportQq_obj=Q()#1.产生q对象q_obj.connector=......
  • 常见HTTP代理服务器错误代码类型及含义梳理
    通常,通过HTTP代理发送到Web服务器的请求失败,都会收到相应的错误状态代码。服务器成功接收到请求但无法处理请求或处理过程中遇到问题时,则会出现5xx错误。如果你想继续使用ht......
  • 预编码ZF,MMSE,THP准则线性预编码误码率仿真
    1.算法概述恒定包络(ConstantEnve-lope,CE)预编码;该算法规定,每根天线上的发射功率被限定为一个与信道条件和信号符号均无关的常数,各根天线均发射恒包络信号,符号信息......
  • 预编码ZF,MMSE,THP准则线性预编码误码率仿真
    1.算法概述恒定包络(ConstantEnve-lope,CE)预编码;        该算法规定,每根天线上的发射功率被限定为一个与信道条件和信号符号均无关的常数,各根天线均发射恒包......
  • 3、梳理DispatcherServlet核心功能!
    今天梳理一下DispatcherServlet的组成结构,了解其各个核心功能。DispatcherServlet只是一个普通的Servlet,它也会接收JavaWeb服务器的request和response参数,从request中......
  • ASCII编码集了解
    1.ASCIIhttps://zhuanlan.zhihu.com/p/348535438,https://developer.aliyun.com/article/294103分为打印字符和不可打印字符,不可打印字符即控制字符,打印不会正常显示,ASCII......
  • python2项目打包rpm笔记
    python2项目打包成rpm包项目目录结构和说明#其中demo的是项目的根目录#pkg是代码逻辑目录#config是配置文件目录#main.py是项目的开始目录#Makefile是打包文件......
  • SpringBoot的TestNg之编码执行+失败重跑+发送邮件
    SpringBoot的TestNg之编码执行+失败重跑+发送邮件转载:https://blog.csdn.net/qq13933506749/article/details/120831213?spm=1001.2101.3001.6661.1&utm_medium=distribut......