专栏首页大猪的笔记python笔记:字符编码错误处理

python笔记:字符编码错误处理

泪奔

'ascii' codec can't encode character

duang,duang,duang。 曾几何时,这句话困扰我好多年。。 今天终于弄清了出现这句话的原因。

背景

有了不同语言就有不同的编码,伴随着各种稀奇古怪的字符,字符编码一直是程序员心中永远的痛。。 为了在不同的编码中切换,在python中,表达字符串是有两种类型的:

unicode
str

没错,就是这么任性。

他们之间存在下面的关系:

unicode ---encode---> str
str     ---decode---> unicode

unicode是python的内置编码,以它为中间跳板,可以把字符串在不同的编码中转换。 然而,这两种类型,直接相加会发生戏剧化的隐式转换。而这个转换,与你的系统编码有关!

如果你的机器是ascii的编码(很遗憾,米国的大部分机器还就是这个编码),那么,在 uni_str + xcode_str的时候,uni_str会自动进行encode("ascii"),如果此时uni_str中有中文的话,那就要挂挂了。

解决

别让它们不同类型相加不就行了。 方法一,把unicode转成正确编码的str:

filename = u"大猪.txt" #显示成什么取决于你的机器
result = filename.encode("utf-8") + "haha"

方法二,将str转成unicode:

filename = u"大猪.txt" #显示成什么取决于你的机器
result = filename + "haha你".decode('utf-8')
print(result.encode("utf-8"))

注意,Print函数如果打印的是系统不认识的编码,还是要挂的哦。所以最后的.encode("utf-8")必不可少,真是一步一坑啊。 就这样,解决了。 就酱,解决了。

识别未知文字

有时候,我们需要对网络上的乱七八糟的东西进行编码。这才是神坑。网页上如果有爬虫得来的内容,很可能是一个大大的乱码。 比如,在数据库中,有一行这样的数据u'\xd7\xeeŒ\xc5\xb5\xc4\xcf\xc2\xc2',如何把它正常的显示出来需要做一些判定了。 用下面的函数可以比较好的处理已经入库的各种编码。

# coding:utf-8
text0 = u'\xd7\xeeŒ\xc5\xb5\xc4\xcf\xc2\xc2\xa5\xb7\xbd\xca\xbd'
text1 = u'\xd7\xeeŒ\xc5\xb5\xc4\xcf\xc2\xc2'
text2 = u'\u7528\u4e86\u4e00\u4e0b\u5348\u7ec8\u4e8e\u628a\u6c34\u94f2\u5149\u4e86'

def utf8_or_empty(text):
    if repr(text).startswith('u'): # 说明是utf-8字符串
        attr = repr(text)[2:4]
        if attr == u'\\u':
            # unicode字符串,直接返回
            return text
        elif attr == u'\\x':
            # utf-8 or gbk的字符串
            try:
                temp_text = text.encode('raw_unicode_escape').decode('utf-8')
            except UnicodeDecodeError:
                temp_text = u""
            if not temp_text:
                try:
                    temp_text = text.encode('raw_unicode_escape').decode('gbk')
                except:
                    temp_text = u""
            return temp_text

print type(utf8_or_empty(text0))
print utf8_or_empty(text0)

print type(utf8_or_empty(text1))
print utf8_or_empty(text1)

print type(utf8_or_empty(text2))
print utf8_or_empty(text2)

参考资料:http://pydoc.net/Python/CodeConvert/2.0.0/CodeConvert/

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python笔记:字符串

    编码解码非常的复杂,unicode才能encode,其它的编码可以decode成unicode。 所以在python中,推荐使用unicode(python3...

    超级大猪
  • 技巧:配置samba使windows共享linux文件

    超级大猪
  • 文本计算器

    超级大猪
  • MarkDown轻量级标记语言

    ####1.标题 #一级标题 ##二级标题 ###三级标题 … ######六级标题 ####2.引用 >这个是引用 >是不是和电子邮件中的 ...

    sofu456
  • Hbuilder-二维码或条形码扫描 原

    使用cordova可以实现扫描二维码或者条形码的功能,但是环境配置比较复杂,需要额外安装插件。

    tianyawhl
  • 记2016腾讯 TST 校招面试经历,电面、笔试写代码、技术面、hr面,共5轮

    (出处:https://cloud.tencent.com/developer/user/1148436/activities) ? 前序:   距离  201...

    林冠宏-指尖下的幽灵
  • 300行ABAP代码实现一个最简单的区块链原型

    这里Jerry就不班门弄斧了,网上有太多的区块链介绍文章。我的这篇文章没有任何高大上的术语,就是300行ABAP代码,实现一个最简单的区块链原型。

    Jerry Wang
  • Python+selenium+PhantomJS获取百度搜索结果真实链接地址

    祝愿所有参加高考的孩子们都能超水平发挥,考出好成绩,考上理想的学校!也希望你们考上大学之后仍然保持高考前的学习劲头!

    Python小屋屋主
  • 智能合约语言 Solidity 教程系列8 - Solidity API

    这是Solidity教程系列文章第8篇介绍Solidity API,它们主要表现为内置的特殊的变量及函数,存在于全局命名空间里。

    Tiny熊
  • 以“码”还“码”,腾讯怎么打好反黑产这场仗

    经验丰富的水手往往知道,在互联网这个汹涌海洋中,除了资源、商船和泡沫外,还有名叫暗网的暗礁,以及一群形态目标各异、却同样贪婪的海盗——羊毛党、黄牛党等黑灰产。...

    腾讯云安全

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动