python编码问题分析
本文首先简要介绍编码转换的基本原理,然后针对字符串处理、文件读写的两个实例,具体分析编码问题的处理方式。
1、编码转换的基本原理
我们知道,只有在面对中文、日文等编码字符(以下均以中文字符为例)时,才会有编码转换问题;而英文字符串是不存在编码转换问题的,因为转来转去都不会变化。
那么分别在什么情况下编码和解码?看下面两个例子就清楚了:
1)编码:Unicode(中文字符)-->String(字符串),当需要把中文字转换为字符串时,用编码encode。
u'中国' #Unicode
Out[1]: u'\u4e2d\u56fd'
type(u'中国')
<type 'unicode'>
u'中国'.encode('utf-8') #编码
Out[2]: '\xe4\xb8\xad\xe5\x9b\xbd' # String
type('\xe4\xb8\xad\xe5\x9b\xbd')
<type 'str'>
2)解码:String(字符串) --> Unicode(中文字符),当需要把字符串转换回中文字时,用解码decode。
'\xe4\xb8\xad\xe5\x9b\xbd'.decode('utf-8') #解码
Out[5]: u'\u4e2d\u56fd'
print u'\u4e2d\u56fd' # Unicode
中国
2、将列表中的数字、字符串、Unicode都转换为string,如何处理?
假设待处理列表为:lst = [1, 'abc', u'中国'],如果使用for循环和str()函数,会导致报错,从以下报错信息中可以发现:其实str()函数在尝试对u'中国'进行ascii编码,这当然行不通;正确的方法是单独用encode()处理Unicode字符。举例如下
错误的处理方法:
for i in lst:
print str(i) #错误的处理方法
#报错:UnicodeEncodeError:'ascii' codec can't encode characters in position 0-1: ordinal not inrange(128)
正确的处理方法:
for i in lst:
if isinstance(i, unicode): #单独处理unicode字符
print i.encode('utf-8')
else: #其余的情况用str()函数处理
print str(i)
#1
#abc
#中国
3、将编码为A的数据,输出到编码为B的文件,如何处理?
举例说明:假设源数据所采用编码为utf-8,希望将源数据保存到编码为gbk的文件。
基本思路:先将utf-8格式源数据decode()回unicode字符(python底层默认编码),注意源文件编码为utf-8,所以decode()中的参数应为utf-8;然后将源文件输出到编码为gbk的文件,注意输出到文件的过程是:将文件内容encode成为我们需要的gbk字符串。
代码如下:
content = u'中国'.encode('utf-8') #演示用:生成utf-8偏码的源数据
content = content.decode('utf-8') #使用utf-8格式解码,得到unicode字符
#源数据保存到编码为gbk的文件,相当于content.encode('gbk')后保存到文件。
path = './'
with codecs.open(path, 'wb', encoding ='gbk', errors='ignore') as f:
f.write(content)
python编码问题分析的更多相关文章
- BASE64编码原理分析脚本实现及逆向案例
在互联网中的每一刻,你可能都在享受着Base64带来的便捷,但对于Base64的基础原理你又了解多少?今天小编带大家了解一下Base64编码原理分析脚本实现及逆向案例的相关内容. 01编码由来 数 ...
- 说说Python编码规范
前言 已有近两个月没有发表过文章了,前段时间外甥和女儿过来这边渡暑假,平常晚上和周末时间都陪着她们了,趁这个周末有空,再抽空再把这块拾起来. 这么久没写了,再次拿起键盘,想想,发表些什 ...
- Python 编码规范(Google)
Python 编码规范(Google) https://blog.csdn.net/q469587851/article/details/54096093 Python 风格规范(Google) 本项 ...
- Python 编码为什么那么蛋疼?
据说,每个做 Python 开发的都被字符编码的问题搞晕过,最常见的错误就是 UnicodeEncodeError.UnicodeDecodeError,你好像知道怎么解决,遗憾的是,错误又出现在其它 ...
- Python编码(encode)和解码(Decode)常见的两个错误
项目地址:https://git.io/pytips 0x07 和 0x08 分别介绍了 Python 中的字符串类型(str)和字节类型(byte),以及 Python 编码中最常见也是最顽固的两个 ...
- (转载) 浅谈python编码处理
最近业务中需要用 Python 写一些脚本.尽管脚本的交互只是命令行 + 日志输出,但是为了让界面友好些,我还是决定用中文输出日志信息. 很快,我就遇到了异常: UnicodeEncodeError: ...
- Python 编码简单说
先说说什么是编码. 编码(encoding)就是把一个字符映射到计算机底层使用的二进制码.编码方案(encoding scheme)规定了字符串是如何编码的. python编码,其实就是对python ...
- Python之路3【知识点】白话Python编码和文件操作
Python文件头部模板 先说个小知识点:如何在创建文件的时候自动添加文件的头部信息! 通过:file--settings 每次都通过file--setings打开设置页面太麻烦了!可以通过:View ...
- python编码规范
python编码规范 文件及目录规范 文件保存为 utf-8 格式. 程序首行必须为编码声明:# -*- coding:utf-8 -*- 文件名全部小写. 代码风格 空格 设置用空格符替换TAB符. ...
随机推荐
- 惊世骇俗的sql语句之连表查询
select `product_skus`.id as skuId, `wname` as sku名称, if(`sku_attributes`.`status`=1,'上架','下架') as 状态 ...
- 『TensorFlow』分布式训练_其二_单机多GPU并行&GPU模式设定
建议比对『MXNet』第七弹_多GPU并行程序设计 一.tensorflow GPU设置 GPU指定占用 gpu_options = tf.GPUOptions(per_process_gpu_mem ...
- python-day2笔记
# 1.为何要有操作系统:# 程序员掌握计算机系统所有的细节有很大难度,并且管理这些部件并加以优化使用,是一件极富挑战性的工作,# 于是,计算机安装了一层软件(系统软件),称为操作系统.它的任务就是为 ...
- Eclipse直接打开类文件/文件夹所在的本地目录
1.Eclipse原生的文件浏览操作 选择项目目录/文件 按 ALT+SHIFT +W , 会弹出菜单点击 System Explorer 就可以打开文件所在的本地目录了: 设置工具目录 Run -- ...
- 【九校联考-24凉心模拟】锻造(forging)
题目背景 勇者虽然武力值很高,但在经历了多次战斗后,发现怪物越来越难打, 于是开始思考是不是自己平时锻炼没到位,于是苦练一个月后发现……自 己连一个史莱姆都打不过了. 勇者的精灵路由器告诉勇者其实是他 ...
- maven聚合工程使用如何debug
maven聚合工程在正常情况下,使用debug时会出错,因为没有源码,就不会显示代码和断点行数条. 进行如下操作: 默认情况下source下只有默认的default文件夹,点击remove进行删除(这 ...
- Ubuntu 系统优化(不定时更新)
系统美化 1. 为Ubuntu安装Numix主题和图标 sudo add-apt-repository ppa:numix/ppa sudo apt-get update sudo apt-get i ...
- SecureCRT修改显示行数
Scrollback buffer应该是保留的行数,初始值500,修改成自己想要的数值保存即可. 参考:http://blog.csdn.net/w410589502/article/details/ ...
- 操作系统IIS安装
IIS在不同的操作系统的安装稍有些差异,如: 1.Windows XP 快捷安装IIS的话,推荐使用IIS一键安装程序包.或者找响应文件包i386,安装所需文件 2.Windows 7 安装IIS,则 ...
- prototype:构造函数的真相、原型链
函数不是构造函数,但是当且仅当使用 new 时,函数调用会变成 ‘构造函数调用’.那么对 ’构造函数‘ 最准确的解释是:所有带 new 的函数调用. Nothing 只是一个普通的函数,但使用 new ...