专栏首页Python攻城狮常见编码问题UnicodeEncodeError

常见编码问题UnicodeEncodeError

文章来源:UnicodeEncodeError

python 里面的编码和解码也就是 unicode 和 str 这两种形式的相互转化。编码是 unicode -> str,相反的,解码就是 str -> unicode。剩下的问题就是确定何时需要进行编码或者解码了.关于文件开头的"编码指示",也就是 # -- coding: -- 这个语句。Python 默认脚本文件都是 UTF-8 编码的,当文件中有非 UTF-8 编码范围内的字符的时候就要使用"编码指示"来修正. 关于 sys.defaultencoding,这个在解码没有明确指明解码方式的时候使用。 比如我有如下代码:

 #! /usr/bin/env python
 # -*- coding: utf-8 -*- 
 s = '中文'  # 注意这里的 str 是 str 类型的,而不是 unicode
 s.encode('gb18030') 
 #这句代码将 s 重新编码为 gb18030 的格式,即进行 unicode -> str 的转换。

因为 s 本身就是 str 类型的,因此 Python 会自动的先将 s 解码为 unicode ,然后再编码成 gb18030。因为解码是python自动进行的,我们没有指明解码方式,python 就会使用 sys.defaultencoding 指明的方式来解码。很多情况下 sys.defaultencoding 是 ANSCII,如果 s 不是这个类型就会出错。拿上面的情况来说,我的 sys.defaultencoding 是 anscii,而 s 的编码方式和文件的编码方式一致,是 utf8 的,所以出错了: UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

对于这种情况,我们有两种方法来改正错误: 一是明确的指示出 s 的编码方式

#! /usr/bin/env python 
# -*- coding: utf-8 -*- 

s = '中文' 
s.decode('utf-8').encode('gb18030') 

二是更改 sys.defaultencoding 为文件的编码方式

#! /usr/bin/env python 
# -*- coding: utf-8 -*- 

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

str = '中文' 
str.encode('gb18030')

看完之后,改成这样 print "<p>addr:", form["addr"].value.decode('gb2312').encode('utf-8') 成功通过.

我总结一下为什么要这么写的原因:

  1. 当取回来的数据与你当前脚本中声明的编码不一致时就要做编码转换

2.在编码转换时首先要将该数据以自身编码的格式换成unicode码,再将这个unicode按utf8编码

3.为什么我的浏览器会传回gb2312的编码数据到服务器,这应该和客户端的系统编码有关系

我爬虫时的错误:

Traceback (most recent call last):
  File "E:/workspace/webCrawler/day04/01��ȡС˵.py", line 56, in <module>
    getText(url)
  File "E:/workspace/webCrawler/day04/01��ȡС˵.py", line 41, in getText
    fileName = i.decode('utf-8')
  File "G:\tools\python2.7.12\lib\encodings\utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-8: ordinal not in range(128)

加入代码

import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )

之后正常运行

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python数据科学(四)- 数据收集系列1.数据型态2.结构化vs半结构化vs非结构化数据3.Python IO与档案处理

    ◆ 定性分析: 分析: _ 知几写了很多篇文章 ◆ 定量分析: 分析:_ 知几写了107篇文章。

    意气相许的许
  • Python模块smtplib让群发邮件变得简单1.smtplib模块介绍2.email.utils模块使用3.发送email的其它几个模块4.实例

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式...

    意气相许的许
  • 文件的打开与关闭-IO1.文件的目的2.文件的打开与关闭 3.文件的读写 4.应用

    就是把一些存储存放起来,可以让程序下一次执行的时候直接使用,而不必重新制作一份,省时省力

    意气相许的许
  • 零基础入门:实时音视频技术基础知识全面盘点

    随着移动网络速度越来越快、质量越来越来,实时音视频技术已经在各种应用场景下全面开花,语音通话、视频通话、视频会议、远程白板、远程监控等等。

    JackJiang
  • java泛型详解

    泛型,即"参数化类型"。就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的...

    后端Coder
  • 【Android 音视频开发打怪升级:音视频硬解码篇】一、音视频基础知识

    不知道大家小时候是否玩过一种动画小人书,连续翻动的时候,小人书的画面就会变成一个动画,类似现在的gif格式图片。

    开发的猫
  • Python2中的中文字符编解码浅析

    自动化测试过程中,输入文本、读取文件、解析网络请求、字符串断言、正则匹配这些步骤都是必不可少的。而Python是测试过程中最为常用的语言之一,很多测试团队的自动...

    腾讯移动品质中心TMQ
  • 剑指offer - 把数字翻译成字符串 - JavaScript

    题目描述:给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个...

    心谭博客
  • 使用ESP32来学习Python之开发环境搭建

    MicroPython官方针对不同的微控制器有不同的固件:http://www.micropython.org/download#esp32

    ManInRoad
  • 5G:中国硬核新巨头,也是每一个中国人的机遇

    从2018年末频谱发放,到今年6月发放牌照、如今正式启动商用,我国5G商用推进速度比预期的早了一年。

    华章科技

扫码关注云+社区

领取腾讯云代金券