位置: 编程技术 - 正文

Python 编码处理-str与Unicode的区别(python中的编码)

编辑:rootadmin

推荐整理分享Python 编码处理-str与Unicode的区别(python中的编码),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python编码表,python编码问题怎么解决,python编码问题怎么解决,python3 编码问题,python编码的编码规范,python编码规则,python编码问题怎么解决,python编码的编码规范,内容如对您有帮助,希望把文章链接给更多的朋友!

一篇关于STR和UNICODE的好文章

整理下python编码相关的内容

注意: 以下讨论为Python2.x版本, Py3k的待尝试

开始

用python处理中文时,读取文件或消息,http参数等等

一运行,发现乱码(字符串处理,读写文件,print)

然后,大多数人的做法是,调用encode/decode进行调试,并没有明确思考为何出现乱码

所以调试时最常出现的错误

错误1

Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeDecodeError: ‘ascii‘ codec can‘t decode byte 0xe6 in position 0: ordinal not in range()

错误2

Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings/utf_8.py", line , in decode return codecs.utf_8_decode(input, errors, True) UnicodeEncodeError: ‘ascii‘ codec can‘t encode characters in position 0-1: ordinal not in range()

首先

必须有大体概念,了解下字符集,字符编码

ASCII | Unicode | UTF-8 | 等等

字符编码笔记:ASCII,Unicode和UTF-8

淘宝搜索技术博客-中文编码杂谈

str 和 unicode

str和unicode都是basestring的子类

所以有判断是否是字符串的方法

def is_str(s): return isinstance(s, basestring)

str和unicode 转换

decode 文档

encode 文档

str -> decode(‘the_coding_of_str‘) -> unicode unicode -> encode(‘the_coding_you_want‘) -> str

区别

str是字节串,由unicode经过编码(encode)后的字节组成的

声明方式

s = ‘中文‘ s = u‘中文‘.encode(‘utf-8‘) >>> type(‘中文‘) <type ‘str‘>

求长度(返回字节数)

>>> u‘中文‘.encode(‘utf-8‘) ‘xe4xb8xadxe6xx‘ >>> len(u‘中文‘.encode(‘utf-8‘)) 6

unicode才是真正意义上的字符串,由字符组成

声明方式

s = u‘中文‘ s = ‘中文‘.decode(‘utf-8‘) s = unicode(‘中文‘, ‘utf-8‘) >>> type(u‘中文‘) <type ‘unicode‘>

求长度(返回字符数),在逻辑中真正想要用的

>>> u‘中文‘ u‘u4e2du‘ >>> len(u‘中文‘) 2

结论

搞明白要处理的是str还是unicode, 使用对的处理方法(str.decode/unicode.encode)

下面是判断是否为unicode/str的方法

Python 编码处理-str与Unicode的区别(python中的编码)

>>> isinstance(u‘中文‘, unicode) True >>> isinstance(‘中文‘, unicode) False >>> isinstance(‘中文‘, str) True >>> isinstance(u‘中文‘, str) False

简单原则:不要对str使用encode,不要对unicode使用decode (事实上可以对str进行encode的,具体见最后,为了保证简单,不建议)

>>> ‘中文‘.encode(‘utf-8‘) Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeDecodeError: ‘ascii‘ codec can‘t decode byte 0xe4 in position 0: ordinal not in range() >>> u‘中文‘.decode(‘utf-8‘) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings/utf_8.py", line , in decode return codecs.utf_8_decode(input, errors, True) UnicodeEncodeError: ‘ascii‘ codec can‘t encode characters in position 0-1: ordinal not in range()

不同编码转换,使用unicode作为中间编码

#s是code_A的str s.decode(‘code_A‘).encode(‘code_B‘)

文件处理,IDE和控制台

处理流程,可以这么使用,把python看做一个水池,一个入口,一个出口

入口处,全部转成unicode, 池里全部使用unicode处理,出口处,再转成目标编码(当然,有例外,处理逻辑中要用到具体编码的情况)

读文件 外部输入编码,decode转成unicode 处理(内部编码,统一unicode) encode转成需要的目标编码 写到目标输出(文件或控制台)

IDE和控制台报错,原因是print时,编码和IDE自身编码不一致导致

输出时将编码转换成一致的就可以正常输出

>>> print u‘中文‘.encode(‘gbk‘) &#;&#;&#;&#; >>> print u‘中文‘.encode(‘utf-8‘) 中文

建议

规范编码

统一编码,防止由于某个环节产生的乱码

环境编码,IDE/文本编辑器, 文件编码,数据库数据表编码

保证代码源文件编码

这个很重要

py文件默认编码是ASCII, 在源代码文件中,如果用到非ASCII字符,需要在文件头部进行编码声明 文档

不声明的话,输入非ASCII会遇到的错误,必须放在文件第一行或第二行

File "XXX.py", line 3 SyntaxError: Non-ASCII character ‘xd6‘ in file c.py on line 3, but no encoding declared; see for details 声明方法

# -*- coding: utf-8 -*- 或者 #coding=utf-8

若头部声明coding=utf-8, a = ‘中文‘ 其编码为utf-8

若头部声明coding=gb, a = ‘中文‘ 其编码为gbk

so, 同一项目中所有源文件头部统一一个编码,并且声明的编码要和源文件保存的编码一致(编辑器相关)

在源代码用作处理的硬编码字符串,统一用unicode

将其类型和源文件本身的编码隔离开, 独立无依赖方便流程中各个位置处理

if s == u‘中文‘: #而不是 s == ‘中文‘ pass #注意这里 s到这里时,确保转为unicode

以上几步搞定后,你只需要关注两个 unicode和 你设定的编码(一般使用utf-8)

处理顺序

1. Decode early 2. Unicode everywhere 3. Encode later

相关模块及一些方法

获得和设置系统默认编码

>>> import sys >>> sys.getdefaultencoding() ‘ascii‘ >>> reload(sys) <module ‘sys‘ (built-in)> >>> sys.setdefaultencoding(‘utf-8‘) >>> sys.getdefaultencoding() ‘utf-8‘ str.encode(‘other_coding‘)

在python中,直接将某种编码的str进行encode成另一种编码str

#str_A为utf-8 str_A.encode(‘gbk‘) 执行的操作是 str_A.decode(‘sys_codec‘).encode(‘gbk‘) 这里sys_codec即为上一步 sys.getdefaultencoding() 的编码

‘获得和设置系统默认编码‘和这里的str.encode是相关的,但我一般很少这么用,主要是觉得复杂不可控,还是输入明确decode,输出明确encode来得简单些(个人观点)

chardet

文件编码检测,下载

>>> import chardet >>> f = open(‘test.txt‘,‘r‘) >>> result = chardet.detect(f.read()) >>> result {‘confidence‘: 0., ‘encoding‘: ‘utf-8‘}

u字符串转对应unicode字符串

>>> u‘中‘ u‘u4e2d‘ >>> s = ‘u4e2d‘ >>> print s.decode(‘unicode_escape‘) 中 >>> a = ‘\u4fee\u\u\ub9\ub6\u\u\uf‘ >>> a.decode(‘unicode_escape‘) u‘u4feeuuub9ub6uuuf‘

标签: python中的编码

本文链接地址:https://www.jiuchutong.com/biancheng/385398.html 转载请保留说明!

上一篇:Python如何获取系统iops示例代码(python如何获取系统绝对路径)

下一篇:python 转换 Javascript %u 字符串为python unicode的代码(python 转换为字符)

  • 预收款交税规定
  • 代开的增值税专票需要另外申报附加税吗?
  • 一般纳税人购买二手车可以抵扣嘛
  • 有营业额有成本怎么算成本占比
  • 现金流量净额正负
  • 信用减值损失借贷方表示什么意思
  • 利润总额和净利润相同说明什么
  • 税务机关对企业实施特别纳税调整,涉及企业向境外
  • 合伙企业转让股权需要其他股东同意吗
  • 计提税费怎么写分录
  • 全额拨款事业单位企业所得税
  • 房产税税率及计算方法最新
  • 建安企业外地项目预缴增值税
  • 工会经费的开支必须取得发票么
  • 预提费用怎么理解
  • 企业注销时资本公积怎么处理
  • 赎回理财产品的利息怎么做账
  • 企业与企业之间借款账务如何处理
  • 发票认证如何认证
  • deepin 20 wifi
  • 系统之家u盘重装系统流程
  • 应交增值税减免税款包括什么
  • 公司员工意外险,死亡能赔多少钱
  • 支付包装物押金是什么科目
  • 国产设备投资抵免企业所得税
  • php加载mysql
  • 电子承兑汇票是什么时候开始的
  • php连接mysql数据库步骤正确的是
  • 为什么运输合同比租赁合同风险小
  • vue axios.all
  • 基于Pytorch的风格转换
  • db2diag命令
  • 百旺金赋开票系统客服电话
  • 收付实现制与权责发生制的例题
  • 小企业原材料
  • 购进小汽车自用为什么可以抵扣进项税
  • 法人股东分红要缴纳多少税
  • 个人在平台销售怎么做
  • 个税查询和实发工资不符合
  • 超过五年的未弥补亏损如何处理?
  • 认缴制无实收资本怎么算
  • sqlserver数据导入mysql
  • 单位安装摄像头合法吗
  • 医院购买医疗器械
  • 考证交社保是怎么回事
  • 收到普票和专票对企业的纳税影响
  • 速动比率和流动比率怎么分析
  • 购买商标权需要缴税吗
  • 同一控股下并合并的股票
  • 民非企业怎么给员工交五险
  • 维保业务怎么开展
  • 政府补贴是否交增值税
  • 征收率和税率的区别举例
  • sqlserver 临时表 准备
  • 数据库的常用语句
  • mysql 5.7.17 winx64安装配置教程
  • win10预览版21277下载
  • badcommandorfilename是什么意思
  • 两台xp电脑怎么共享文件
  • winxp注销快捷键
  • windows xp远程控制
  • centos6启动不了
  • u盘安装linux系统遇到的问题
  • 制作xp系统盘需要多大u盘
  • 把mac屏幕切换到桌面desktop
  • win8系统如何打开摄像头
  • 电脑win8.1系统怎么样
  • w10系统有什么好处
  • linux软件列表
  • win8系统隐藏文件怎么查看
  • 常用的linux系统版本有哪些
  • 支持google play
  • android sdk platform要安装吗
  • linux bash脚本
  • 个人自行申报纳税
  • 北京税务局公众平台官网
  • 个体商户营业额多少万以下免税
  • 办理税务需要开户许可证吗
  • 北京朝阳国家税务总局
  • 报税卡丢了要怎么处理
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设