Python字符串的encode与decode研究心得乱码问题解决方法

Python字符串的encode与decode研究心得乱码问题解决方法

为什么Python使用过程中会出现各式各样的乱码问题,明明是中文字符却显示成“\xe4\xb8\xad\xe6\x96\x87”的形式?

为什么会报错“UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)”?本文就来研究一下这个问题。


字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。
decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换成unicode编码。
encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode('gb2312'),表示将unicode编码的字符串str2转换成gb2312编码。
因此,转码的时候一定要先搞明白,字符串str是什么编码,然后decode成unicode,然后再encode成其他编码
代码中字符串的默认编码与代码文件本身的编码一致。

如:s='中文'
如果是在utf8的文件中,该字符串就是utf8编码,如果是在gb2312的文件中,则其编码为gb2312。这种情况下,要进行编码转换,都需要先用decode方法将其转换成unicode编码,再使用encode方法将其转换成其他编码。通常,在没有指定特定的编码方式时,都是使用的系统默认编码创建的代码文件。
如果字符串是这样定义:s=u'中文'
则该字符串的编码就被指定为unicode了,即python的内部编码,而与代码文件本身的编码无关。因此,对于这种情况做编码转换,只需要直接使用encode方法将其转换成指定编码即可。
如果一个字符串已经是unicode了,再进行解码则将出错,因此通常要对其编码方式是否为unicode进行判断:
isinstance(s, unicode) #用来判断是否为unicode
用非unicode编码形式的str来encode会报错
如何获得系统的默认编码?

#!/usr/bin/env python
#coding=utf-8
import sys
print sys.getdefaultencoding() 

该段程序在英文WindowsXP上输出为:ascii 

在某些IDE中,字符串的输出总是出现乱码,甚至错误,其实是由于IDE的结果输出控制台自身不能显示字符串的编码,而不是程序本身的问题。
如在UliPad中运行如下代码:

s=u"中文"
print s 

会提示:UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)。这是因为UliPad在英文WindowsXP上的控制台信息输出窗口是按照ascii编码输出的(英文系统的默认编码是ascii),而上面代码中的字符串是Unicode编码的,所以输出时产生了错误。

将最后一句改为:

print s.encode('gb2312')

则能正确输出“中文”两个字。

若最后一句改为:

print s.encode('utf8')

则输出:\xe4\xb8\xad\xe6\x96\x87,这是控制台信息输出窗口按照ascii编码输出utf8编码的字符串的结果。

unicode(str,'gb2312')与str.decode('gb2312')是一样的,都是将gb2312编码的str转为unicode编码
使用str.__class__可以查看str的编码形式
原理说了半天,最后来个包治百病的吧:

#!/usr/bin/env python 
#coding=utf-8 

s="中文" if isinstance(s, unicode): #s=u"中文" print s.encode('gb2312') else: #s="中文" print s.decode('utf-8').encode('gb2312')

 

posted on 2015-07-03 15:27 小鸡喝饼 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/xuxianren/p/4618778.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405521.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式开发中关键字_IO 和 volatile的用法

一、描述 在开发嵌入式过程中&#xff0c;常会看到_IO 修饰符&#xff0c;这两个修饰符是在Core_cm3.h中被重定义&#xff1a; /* IO definitions (access restrictions to peripheral registers) */ #ifdef __cplusplus#define __I volatile /*!< defi…

table简单排序

早些时候基于jQuery写的一个table排序&#xff0c;暂时只支持简单的数据类型排序。以后有时间改写成原生js的 直接上代码了&#xff0c;写的不好&#xff0c;纯属记录 tabletable 浏览评论主题作者最后评论 共有精品数200个10023232北京的天气真是干燥&#xff0c;让人觉得不舒…

html循环c for,两层c:forEach循环嵌套

jsp中两级菜单如何用c:forEach输出items要被循环的信息否无begin开始的元素(0第一个元素&#xff0c;1第二个元素)否0end最后一个元素(0第一个元素&#xff0c;1第二个元素)否Last elementstep每一次迭代的步长否1var代表当前条目的变量名称否无varStatus代表循环状态的变量名称…

Gvim 字体大小设置和FencView插件安装

1. GVim更改字体及大小 在命令模式下输入: set guifontlucida\ console:h14 其中&#xff0c;字体名有空格的话&#xff0c;要转义下. 2. FencView插件(Ver4.8)下载位置&#xff1a; http://vim.sourceforge.net/scripts/download_script.php?src_id17381 解压出来后&am…

【原创】俄罗斯方块Tetris version2.1 by yuanfeng1129

#include<windows.h>#include<time.h>#include<stdlib.h>#include"resource.h"#define W 14 //游戏区域宽度#define H 26 //游戏区域高度#define W1 6 //右边状态栏宽度#define BSIZE 25 //游戏方格边长#define Y1 6 //放置照片的纵坐标#define Y2…

怎没用计算机算e的,小E教你们如何用计算机算虚数

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼首先打开计算器电源(ON)注&#xff1a;()代表注释 ( )代表第二功能键1.shift2.(Pol)3.14.shift5.(,)6.07.)8.9.狂按分数线&#xff0c;直到按到顶不动为止(似乎是6个)10.按 (显示Syntax ERROR 不要管它)&#xff0c; AC&#xff0c…

物联网IoT接入技术分类以及华为OC平台特性

一、主流物联网接入技术应用场景划分 4G/5GLTE-V&#xff1a; 传输速率>10Mbps&#xff1b;功耗较高 应用业务&#xff1a;车联网、视频监控、智能机器eMTC/GPRS 传输速率<1Mbps&#xff1b;成本较低&#xff0c;功耗较低 应用业务&#xff1a;穿戴、车辆调度、电子广…

AT91RM9200Linux移植笔记(三)-移植Linux kernel 2.6.17

AT91RM9200Linux移植笔记(三)-移植Linux kernel 2.6.17 手上板子原来自带的是2.4.19的内核&#xff0c; 打算移植新的2.6的内核&#xff0c;从网上下了2.6.17的kernel&#xff0c;下载地址为&#xff1a;http://www.kernel.org/pub/linux/kernel/v2.6/修改PATH环境变量或者Mak…

css html5360百科,div+css

所谓CSS优先级&#xff0c;即是指CSS样式在浏览器中被解析的先后顺序。内联样式(inline style) > ID选择符 > 类选择符(class), 伪类(pseudo-class)和属*(attribute)选择符 > 类别(type)&#xff0c;伪对象(pseudo-element)一,解释:*内联样式(inline style):元素的sty…

Spring学习(10)--- @Qualifier注解

按类型自动装配可能多个bean实例的情况&#xff0c;可以使用Spring的Qualifier注解缩小范围&#xff08;或指定唯一&#xff09;&#xff0c;也可以指定单独的构造器参数或方法参数可用于注解集合类型变量例子&#xff1a; package com.mypackage;import org.springframework.b…

NB模组基本AT指令

1、终端开机命令 ATCFUN0 2、查询软件版本号 ATCGMR 3、查询设备号 ATCGSN1 4、设置设备号 ATNTSETID1,xxxxx 5、设置IOM南向地址 ATNCDPxx.xx.xx.xx 6、设置APN ATCGDCONT1,"IP","xxxx" 7、复位 ATNRB 8、开机 ATCFUN1 9、查询sim卡imsi …

标准SQL注入入侵语句

1.判断有无注入点; and 11 and 12 2.猜表一般的表的名称无非是admin adminuser user pass password 等..and 0<>(select count(*) from *)and 0<>(select count(*) from admin) ---判断是否存在admin这张表3.猜帐号数目 如果遇到0< 返回正确页面 1<返回错误页…

字符编码·ISO8859

From: http://hanwei0143.blog.163.com/blog/static/5192699320071039342262/ 1&#xff0e; 名称的由来 ISO 8859&#xff0c;全称ISO/IEC 8859&#xff0c;是国际标准化组织(ISO)及国际电工委员会(IEC)联合制定的一系列8位字符集的标准&#xff0c;现时定义了15个字符集。 …

友讯(d-link)dwa-525 150m无线台式计算机网卡,D-Link新款台式机无线网卡即将上市

D-Link&#xff0c;日前发布了一款新型wireless N 150M台式机无线网卡——DWA-525。据D-Link中国产品负责人透露&#xff0c;该款网卡在大陆也即将上市&#xff0c;具体上市时间表请广大用户留意官方网站公告以及就近咨询各地经销商。DWA-525是一款单天线wireless N 台式机无线…

寒冰王座(完全背包+多解)

欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院 寒冰王座 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 12875 Accepted Submission(s): 6548 Problem Description不死族的巫妖王发工资拉,死…

深度学习--Matlab使用LSTM长短期记忆网络对负荷进行预测

一、LSTM描述 长短期记忆网络&#xff08;LSTM&#xff0c;Long Short-Term Memory&#xff09;是一种时间循环神经网络&#xff0c;是为了解决一般的RNN&#xff08;循环神经网络&#xff09;存在的长期依赖问题而专门设计出来的&#xff0c;所有的RNN都具有一种重复神经网络…