python3 UnicodeEncodeError的错误

标签: python EncodeError
6人阅读 评论(0) 收藏 举报
分类:
我遇到问题的情况是:

在win10系统下输入json,其中有gbk无法识别的字符,进而无法在cmd下输出,也无法IO write()到本地文件。

参考此篇:【总结】Python 2.x中常见字符编码和解码方面的错误及其解决办法 点击打开链接

描述参考:


Python中,打印含某些特殊字符的Unicode类型字符串,但是输出终端中字符编码集中不包含这些特殊字符

现象

虽然已经获得了Unicode的字符串了,但是当打印Unicode类型的字符串,到某些终端中时,结果却还是出错了。

比如,下面的例子中,就是把Unicode字符串,打印到Windows的cmd中,结果出错:

python_2.x_print_unicode_still_error.py

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
-------------------------------------------------------------------------------
Function:
【总结】Python中常见字符编码和解码方面的错误及其解决办法
https://www.crifan.com/summary_python_2_x_common_string_encode_decode_error_reason_and_solution
 
Author:     Crifan
Verison:    2012-11-29
-------------------------------------------------------------------------------
"""
  
#任何字符,都可以在:
#http://unicodelookup.com/
#中,查找到对应的unicode的值
 
def python2xPrintUnicodeStillError():
    #http://zhidao.baidu.com/question/500133781.html
    slashUStr = "\\u3232\\u6674"; #(有) 晴
    decodedUniChars = slashUStr.decode("unicode-escape"); #此处已经可以正常获得对应的两个Unicode字符了
    unicodeButContainSpecialChar = decodedUniChars;
    print "unicodeButContainSpecialChar=",unicodeButContainSpecialChar;
     
    #此处在GBK编码的cmd中输出的话,会出现错误的:
    #UnicodeEncodeError: 'gbk' codec can't encode character u'\u3232' in position 0: illegal multibyte sequence
    #那是因为,Unicode字符:0x3232,是个特殊字符,而此字符,在GBK编码字符集中,本身就不包含此特殊字符,所以当然没法把这个特殊字符编码为对应的GBK字符,所以出错,更无法显示
 
###############################################################################
if __name__=="__main__":
    python2xPrintUnicodeStillError();

原因

上述过程中,虽然已经获得了正确的unicode字符串了,但是由于此unicode字符串中包含了一个特殊字符,即那个\u3232,对应的字符,显示出来,像是左右括号中间一个"有"字,即类似于这样的:

(有)

而此特殊字符,GBK字符集中没有,不存在,所以无法将对应的Unicode字符,编码为对应的GBK字符,所以出现UnicodeEncodeError,更无法打印出来

注:

对于任何字符,都可以去这里:

http://unicodelookup.com/

而查到,对应的unicode的值,html中的写法。

提醒:

可以通过输入:

0x3232

而查到该特殊字符。


解决办法

解决办法,则是不同情况,不同处理:

(1)如果对于这些特殊字符,你不是很关心,即使不显示也无所谓,但是希望剩下的,其他大多数的正常的字符都能显示。

即,忽略掉特殊字符,显示哪些能显示的字符, 那么可以改为如下代码:

python_2.x_print_unicode_omit_special.py

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
-------------------------------------------------------------------------------
Function:
【总结】Python中常见字符编码和解码方面的错误及其解决办法
https://www.crifan.com/summary_python_2_x_common_string_encode_decode_error_reason_and_solution
 
Author:     Crifan
Verison:    2012-11-29
-------------------------------------------------------------------------------
"""
  
#任何字符,都可以在:
#http://unicodelookup.com/
#中,查找到对应的unicode的值
 
def python2xPrintUnicodeOmitSpecial():
    #http://zhidao.baidu.com/question/500133781.html
    slashUStr = "\\u3232\\u6674"; #(有) 晴
    decodedUniChars = slashUStr.decode("unicode-escape"); #此处已经可以正常获得对应的两个Unicode字符了
    unicodeButContainSpecialChar = decodedUniChars;
    #print "unicodeButContainSpecialChar=",unicodeButContainSpecialChar;
     
    #此处在GBK编码的cmd中输出的话,会出现错误的:
    #UnicodeEncodeError: 'gbk' codec can't encode character u'\u3232' in position 0: illegal multibyte sequence
    #那是因为,Unicode字符:0x3232,是个特殊字符,而此字符,在GBK编码字符集中,本身就不包含此特殊字符,所以当然没法把这个特殊字符编码为对应的GBK字符,所以出错,更无法显示
     
    #如果只是想要:
    #显示那些正常可以显示的字符,忽略个别特殊不能显示的字符
    #那么可以改为如下代码:
    encodedShowableGbk = unicodeButContainSpecialChar.encode("GBK", "ignore");
    print "encodedShowableGbk=",encodedShowableGbk; #encodedShowableGbk= 晴
 
###############################################################################
if __name__=="__main__":
    python2xPrintUnicodeOmitSpecial();

注:我之前遇到的一个情况,就是通过添加ignore去处理的:

【已解决】UnicodeEncodeError: ‘gbk’ codec can’t encode character u’\u200e’ in position 43: illegal multibyte sequence

(2)如果必须要显示这些字符,或者说必须要保留这些字符。那么本身对于打印这个需求来说,是可以不打印的,因为本身已获得了正常的Unicode字符了。

然后剩下的,只是尽量你自己所需要的后续的处理即可。

即, 已经得到了正确的unicode字符了,后续该咋办咋办,可以不打印的时候,就不打印,也就不会出错了。

 

举一反三

如果以后遇到这种,虽然已获得了Unicode字符串,但是还是无法打印等情况,则就要注意去调查一下,是否是由于此处有特殊字符,不存在于输出目标所用字符集中,才导致此问题的。


- - - - - -

但在具体实现时发现有问题,其中关键语句:

string_gbk = string.encode("GBK", "ignore")

实际操作时,还应decode一下,即:

string_gbk = string.encode("GBK", "ignore")
string = string_gbk.decode("GBK")
print(string)
save.write(string)
查看评论

Python3网络爬虫实战案例

主讲老师: 崔庆才 ,静觅博客博主,Python技术控,爬虫博文访问量已过百万。喜欢钻研,热爱生活,乐于分享。 个人博客:静觅 | http://cuiqingcai.com/ 适用人群: 萌新小白:我连爬虫也不知道是什么 入门菜鸟:我对一些爬虫的用法还不是很熟练 老司机:我想学习更高级的框架及分布式 从环境基础到进阶分布式,由浅入深,逐篇递进。
  • 2017年04月19日 19:02

Python3 下打印 utf-8 字符串出现 UnicodeEncodeError 错误

python3 如果要输出utf-8,需要通过以下代码将ANSI_X3.4-1968改为utf-8
  • yilovexing
  • yilovexing
  • 2017-09-08 10:24:50
  • 369

python笔记 爬虫经常出现的错误UnicodeEncodeError

UnicodeEncodeError: ‘gbk’ codec can’t encode character u’\xa0’ in position 3621: illegal multibyte s...
  • SVALBARDKSY
  • SVALBARDKSY
  • 2016-03-08 22:41:56
  • 862

Python 3 UnicodeEncodeError: 'gbk' codec can't encode错误的解决

正在Windows上用Python 3 写一个爬虫,但是读取网页内容并且把网页内容写进txt文件的时候,出现了这个异常:UnicodeEncodeError: 'gbk' codec can't en...
  • zheng_integer
  • zheng_integer
  • 2017-02-18 20:55:34
  • 1986

ftplib连接ftp的时候,遇到中文路径报了错误UnicodeEncodeError: 'latin-1' codec

--版本python3 --模块:ftplib 使用ftplib连接ftp的时候,遇到中文路径报了错误UnicodeEncodeError: 'latin-1' codec can't...
  • zuihai
  • zuihai
  • 2017-03-19 16:05:32
  • 799

【sublime text3】解决UnicodeEncodeError: 'ascii' codec... 的问题——python3

网上存在大量的解决这个问题的方法好像都是相互转载的,其实需要区分是python3本身的问题还是工具的问题1.先在终端输出中文,可以2.用工具输出,报以上错误so:工具问题解决sublime text3...
  • dangbai01_
  • dangbai01_
  • 2018-01-04 08:49:24
  • 377

使用python向MySQL数据库中插入数据时报错UnicodeEncodeError的解决办法

版本说明: Python3.5 MySQL5.7 mysqlclient应该是最新的 >>> ================== RESTART: C:\Users\rHotD\Desktop\t...
  • HeatDeath
  • HeatDeath
  • 2017-03-24 19:54:17
  • 1106

Python3 sublime3 中文 UnicodeEncodeError 问题

问题描述:使用python3 sublime3 编译执行python文件,无法打印中文字符控制台提示<code>UnicodeEncodeError: 'ascii' co...
  • xujingzhong0077
  • xujingzhong0077
  • 2018-02-09 09:11:31
  • 61

python(三):Python3—UnicodeEncodeError 'ascii' codec can't encode characters in position 0-1

Python3—UnicodeEncodeError 'ascii' codec can't encode characters in position 0-1
  • AckClinkz
  • AckClinkz
  • 2017-11-15 10:52:53
  • 1851

Django UnicodeEncodeError解决

UnicodeEncodeError: ‘ascii’ codec can’t encode characte
  • u011109881
  • u011109881
  • 2016-07-15 17:58:45
  • 888
    个人资料
    等级:
    访问量: 6
    积分: 9
    排名: 258万+
    文章分类
    文章存档