前言
对于很多接触Python的人而言,字符的处理和语言整体的温顺可靠相比显得格外桀骜不驯难以驾驭。
文章针对Python 2.7,主要因为3对的编码已经有了很大的改善并且实际原理一样,更改一下操作命令即可。
了解完本文,你可以轻松解决文字处理,特殊平台(Windows?)下的编码,爬虫编码等问题。
阅读建议
本文分为如下几个部分:
**1.原理**
**2.具体操作
**
**3.建议的使用习惯
**
**4.疑难问题解答
**
如果想要了解我给出的使用习惯,可以直接跳到建议的使用习惯。
如果只想要解决相关问题可以直接跳到疑难问题解答。
希望本文能够帮到你。
原理
为了理解方便,这里不谈理论只做类比,具体想要进一步了解各种编码的理论的百度一下好了。
首先说一下我们为什么会碰到各式各样的编码问题:
1.因为我们没有统一编码
**2.因为我们没有用对命令(传对数据)
**
再说一下编码是什么,Python的编码看似复杂,实际上可以看做只有两类编码:Unicode,二进制
**1.Unicode 相信都很熟悉**:,就是`\u0000`这样的
**2.二进制编码也很简单**,就是`\x00\x00`这样的,平常看到的`utf-8`,`cp936`都是二进制编码
**3.二进制编码是具象的**,`10001100`原样就可以存储,而Unicode是抽象的,不能这样存
#coding=utf8
# Unicode编码演示
print('Unicode:')
print(repr(u'Unicode编码'))`
# 二进制编码演示
print(u'二进制编码:')
print(repr('Unicode编码'))`
# 只是看个样子,代码不必去深究
再说怎么做,就是只有同种编码之间才可以操作
举个简单的类比
就把一串数据比为烤鸭,我们作为人和鸭子不同种看待烤鸭的态度完全不一样。
我们看到的是晚上的配菜,鸭子看到的是自己二舅。
那么我在逛烤鸭店的时候用错编码就会报错。
因为我在烤鸭店看到了满世界的二舅。
这里说的同种就是我们熟悉的各种编码方式:utf-8,unicode,ucs-bom
这也就是编码问题的核心,非常重要。
最后说一下Python的环境
**1.本身代码是用Ascii解码的,文件里有Ascii无法解码的内容的话要告知Python怎么解码
**
**2.内部大量命令都是默认接受Unicode
**
# 告知的命令就是下面这一行,删掉就会报错
#coding=utf8
print(u'测试编码')
具体操作
拿到各种编码的内容自然是不用说,那么如果我们想要自己构造怎么做呢,看下面:
#coding=utf8
# 字符串前面加u会默认构造出Unicode的字符串
unicodeString = u'Unicode字符串'
# 字符串前面什么都不加会构造出默认编码(首行限定了现在的utf8)的字符串
utf8String = 'Utf-8字符串'
# 当然,没有首行,默认的编码是Ascii
那么他们之间怎么转换呢,同样很简单:
# 接上一段程序
# Unicode转化为二进制编码中的一种:utf8
unicodeString.encode('utf8')
# 二进制编码根据自己的编码种类转化为Unicode
utf8String.decode('utf8')
# 如果二进制编码中混进了奇怪的东西可以根据需求用特殊的decode策略
print(repr('u8字\x00符串'.decode('utf8', 'replace')))
那么怎么样会出现问题呢:
# 接上一段程序
# 如果我们把他们转化成同样的编码方式就可以操作(例如相加)
print(repr(unicodeString + utf8String.decode('utf8')))
print(repr(unicodeString.encode('utf8') + utf8String))
# 但如果不转化,当然就会出现满世界的烤鸭二舅啦
unicodeString + utf8String
# 所以另一方面也发现,编码转换是需要我们告诉程序怎么做的
# 所有`decode`操作都会生成Unicode编码,这是为了方便我之前说的大量接受Unicode的内部命令
所以我们需要确定程序使用的编码,这是我们需要告诉程序的东西
**1.一方面在操作字符串的时候确定是同种编码
**
2.另一方面在使用非自己写的命令时,一般使用Unicode,或者使用接收二进制编码的命令
#coding=utf8
# 这里拿写入文件举例
# 一般使用Unicode
with open('Unicode.txt', 'w') as f: f.write(u'Unicode测试')
# 或者使用接收二进制编码的命令
with open('Utf8.txt', 'wb') as f: f.write('Utf8测试')
# 你可以反过来做个测试,自然会报错
# 二进制的命令方便了在不知道怎么解码的情况下也能进行操作(写入文件)
我建议的使用习惯
相信到这里我已经把我对于编码的理解讲完了。
我们为什么会碰到各式各样的编码问题:
**1.因为我们没有统一编码**
**2.因为我们没有用对命令(传对数据)**
所以这里再重申一下八字真言:确定编码,同类交互
**1.碰到问题,问一下自己,我现在是哪种编码**
**2.同一种编码才能交互,那我应该是哪种编码
**
这里给出我的使用习惯:
**1.确定一种内部编码
**
2.内部编码的选择优先级如下:程序必须使用的编码、第三方包使用的编码、你喜欢的编码、Unicode
**3.在输出时再更改到特定的编码
**
记得在开始整个程序之前确定内部的编码,否则编码一团糟会产生很多不必要的bug。
不要迷信内部Unicode,例如Evernote开发就应该根据第三方包使用的Utf8确定内部编码。
疑难问题解答
编码识别
说了要确定编码,那么拿到一串二进制要怎么确定编码呢?
最简单的方法是chardet:(需要安装)
python -m pip install chardet
使用非常简单:
#coding=utf8
from chardet import detect
print(detect('这是一串utf8的测试字符'))
# 结果:`{'confidence': 0.99, 'encoding': 'utf-8'}`
另外例如抓取网站,那么头文件中很有可能有提示如何解码,记得不要忘记了。
编码转换
很可能因为字符串中参杂了奇怪的东西,导致即使编码种类正确,依旧无法解码。
我知道我之前讲过了,但可能有人直接跳疑难问题解答嘛。
这里可以使用decode
的第二个参数:
#coding=utf8
# 字符串中混进了\x00
rubbishUtf8String = 'Utf-8字\x00符串'
print(repr(rubbishUtf8String.decode('utf8', 'replace')))
print(repr(rubbishUtf8String.decode('utf8', 'ignore')))
特殊平台下编码
很多人都说Windows是个坑,即使在Python 3下面也一样。
因为中文文件名出来都是乱码。
这里使用一个取巧的方法:平台编码再特殊,起码命令行读取和创建一个文件夹不会出乱码吧。
import sys, os
for folder in os.walk('.').next()[1]:
print(folder.decode(sys.stdin.encoding))
同样的输入输出也可以这样做优化:
import sys
def sys_print(msg):
print(msg.encode(sys.stdin.encoding))
def sys_input(msg):
return raw_input(msg.encode(sys.stdin.encoding)).decode(sys.stdin.encoding)
文件写入
如果抓下来一个内容不知道怎么解码,但还是想要写入文件怎么办
写入文件的时候制定用二进制命令即可:
#coding=utf8
import urllib
with open('Utf8.txt', 'wb') as f: f.write('Utf8测试')
# 比如抓了个网页,不知道编码也可以写入文件进行一系列操作
content = urllib.urlopen('http://www.baidu.com').read()
with open('baidu.txt', 'wb') as f: f.write(content)
裸Unicode字符
Unicode存成六个Ascii字符怎么办?其实也可以decode
#coding=utf8
# 这是普通的Unicode
s = u'测'
for i in s: print(i)
print(repr(s))
# 这是裸Unicode,实际存成了六个Ascii
s = repr(s)[2:-1]
for i in s: print(i)
print(repr(s))
# 转化其实也很简单
s = s.decode('unicode-escape')
for i in s: print(i)
print(repr(s))
总结
以上就是详细介绍Python字符编码的全部内容,希望读完这篇文章能对大家能有帮助,有什么不足之处万望指正,希望大家多多支持脚本之家。
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。