为什么会报错“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-8s="中文"

ifisinstance(s, unicode):

#s=u"中文"print s.encode('gb2312')else:

#s="中文"print s.decode('utf-8').encode('gb2312')

python中字符串中文乱码_Python中文乱码的处理相关推荐

  1. python中字符串的基本操作_python字符串的基本操作

    # 字符串是python最常用的数据类型 # 因字符串是不可变的,所以除分片赋值外的所有标准序列操作对字符串适用 # temp1='just soso' # print temp1[-1:] # o ...

  2. python中字符串怎么引用_Python:字符串中引用外部变量的3种方法

    方法一: username=input('username:') age=input('age:') job=input('job:') salary=input('salary') info1='' ...

  3. python中字符串查找子串_Python字符串中查找子串的方法

    Python字符串中查找子串的方法 发布于 2015-04-12 08:58:32 | 230 次阅读 | 评论: 0 | 来源: 网友投递 Python编程语言Python 是一种面向对象.解释型计 ...

  4. python中字符串异或_python 异或加密字符串的实例

    python 异或加密字符串的实例 做个简单习题:输入明文给定秘钥,密文还原,按位异或处理. import base64 as b64 def xor_encrypt(tips,key): ltips ...

  5. python中字符串转数组_python字符串转数组

    Python中有split()和os.path.split()两个函数,具体作用如下: split():拆分字符串.通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(list) os.path ...

  6. python中字符串切片取奇数_Python中的字符串切片(截取字符串)的详解

    Python中的字符串切片(截取字符串)的详解 字符串索引示意图 字符串切片也就是截取字符串,取子串 Python中字符串切片方法 字符串[开始索引:结束索引:步长] 切取字符串为开始索引到结束索引- ...

  7. linux中popen汉字乱码,Python中使用subprocess.Popen返回值乱码解决方案

    Python中使用subprocess.Popen返回值乱码解决方案 问题描述 在python 2.7中,使用subprocess.Popen()调用*nix命令,并通过管道,获取其输出,并将其返回值 ...

  8. python中字符串函数的用法_python中字符串内置函数的用法介绍(代码)

    本篇文章给大家带来的内容是关于python中字符串内置函数的用法介绍(代码) ,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. capitalize() 首字母大写a='somewor ...

  9. python中字符串函数的用法_python中字符串内置函数的用法总结

    capitalize() 首字母大写 a='someword' b=a.capitalize() print(b) ->Someword casefold()&lower() 所有字母变 ...

  10. python中字符串模块_Python字符串模块

    python中字符串模块 Python String module contains some constants, utility function, and classes for string ...

最新文章

  1. C语言中“野指针”、“悬空指针”是什么?
  2. Spring Cloud Alibaba【Nacos 服务治理】 高可用保证:Nacos 如何有效构建注册中心集群
  3. (超级详细)numpy与torch用法对比手册
  4. 问题1:程序员要做一辈子?
  5. python3 多线程简介
  6. metasploit快速入门(一)安装部署
  7. TextView显示插入的图片
  8. Linux web服务器初始化设置
  9. 安徽工业大学计算机考研历年分数线,安徽工业大学历年考研分数线汇总[2012-2021]...
  10. 前端开发 容器标签span与div 0228
  11. 【Yarn】hadoop的yarn资源队列
  12. PAT L1 049 天梯赛座位分配
  13. ReportMachine终于有更新了。
  14. 【蓝桥杯】枚举,模拟,排序专题 (一)
  15. # BJTUOJ 一颗姜会长多高? (二分+前缀和+简单贪心)
  16. mac重启后,桌面壁纸失效的问题
  17. ajax返回request,WordPress的Ajax请求返回0(Wordpress ajax request return 0)
  18. 【莹伙丛】Dependencies should no longer be declared using the compile and runtime configurations
  19. 在Web 3D 游戏开发的前端如何快速上手进行
  20. 富通天下(W 笔试)

热门文章

  1. dell 如何给raid分区_Dell服务器如何进行RAID级别在线转换及RAID扩容
  2. H3C S5500V2交换机误格式化恢复
  3. 关于质性分析软件NVivo更新的问题
  4. 3V升压5V芯片,3V升压5V的电路图
  5. knockoutjs
  6. Java swing 开发windows桌面应用:课堂点名程序
  7. C++ 串口调试工具源码
  8. 陈纪修老师《数学分析》 第05章:微分中值定理及其应用 笔记
  9. 四层和八层电梯控制系统Proteus仿真设计,51单片机,附仿真和Keil C代码
  10. 正商职业学校预付费云平台系统 的设计与应用