博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python编码问题整理
阅读量:5751 次
发布时间:2019-06-18

本文共 2767 字,大约阅读时间需要 9 分钟。

认识常见编码

 

  GB2312是中国规定的汉字编码,也可以说是简体中文的字符集编码

  GBK 是 GB2312的扩展 ,除了兼容GB2312外,它还能显示繁体中文,还有日文的假名

  cp936:中文本地系统是Windows中的cmd,默认codepage是CP936,cp936就是指系统里第936号编码格式,即GB2312的编码。

    (当然有其它编码格式:cp950 繁体中文、cp932 日语、cp1250 中欧语言。。。)

  Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。

  UTF-8 (8-bit Unicode Transformation Format)是最流行的一种对 Unicode 进行传播和存储的编码方式。它用不同的 bytes 来表示每一个代码点。ASCII 字符每个只需要用一个 byte ,与 ASCII 的编码是一样的。所以说 ASCII 是 UTF-8 的一个子集。

 

在开发Python程序的过程中,会涉及到三个方面的编码:

  • Python程序文件的编码
  • Python程序运行时环境(IDE)的编码
  • Python程序读取外部文件、网页的编码

 

 

Python程序文件的编码

例如:

Python2自带的IDE,当创建了一个文件保存的时候提示:

  这是因为Python2编辑器默认的编码是ASCII,它是无法识别中文的,所以会弹出这样的提示。这也是我们在大多情况下写python2程序的时候习惯在程序的第一行加上:#coding=utf-8

  其实,这里的编码文件是很容易解决的。

 

 

Python程序运行时环境(IDE)的编码

  

执行下面的一段程序。

#coding=utf-8from selenium import webdriverdriver = webdriver.Firefox()driver.get("http://www.baidu.com")# 返回百度页面底部备案信息text = driver.find_element_by_id("cp").textprint(text)driver.close()

windows cmd下执行:

 

我们要获取的信息是:

©2015 Baidu   ICP030173

  Windows cmd 用的是cp936,也就是中文的GB2312,在GBK的字符集里没有“©”,这就导致通过GBK解析的时候出现编码问题。

  这就像你在翻译英文的时候,出现了一个单词,这个单词你查遍了牛津大词典都没找到对应的含义解释,那么自然是会有问题的。

  那假设,我还就想在cmd下执行这个python程序了,那么可以去修改cmd的默认编码类型为utf-8,对应的编码为CHCP 65001utf-8)。在cmd 下输入:chcp 65001 命令回车。

然后,修改cmd的字体为“Lucida Console”,再来执行程序就可以被正确输出了。

 

 

Python程序读取外部文件、网页的编码

 

#这一块,暂时没有找到合适的例子

 

 

查看Python系统编码

查看Python2 Python3的系统编码。

Python2:

Python 2.7.10 (default, May 23 2015, 09:40:32) [MSC v.1500 32 bit (Intel)] on win32Type "copyright", "credits" or "license()" for more information.>>> import sys>>> sys.getdefaultencoding()'ascii'

Python3:

Python 3.5.0 (v3.5.0:374f501f4567, Sep 13 2015, 02:27:37) [MSC v.1900 64 bit (AMD64)] on win32Type "copyright", "credits" or "license()" for more information.>>> import sys>>> sys.getdefaultencoding()'utf-8'

 

那么如何修改Python2的系统编码为urf-8呢?

import sysreload(sys)sys.setdefaultencoding('utf-8')

 

所以,在你的程序执行的过程中,遇到下面的报错信息时。

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1....

可以将上面的三行代码加到Python程序的头部。

 

 

decode()与encode()

 

  • decode 的作用是将其他编码的字符串转换成 Unicode 编码,eg name.decode(GB2312),表示将GB2312编码的字符串name转换成Unicode编码。
  • encode 的作用是将Unicode编码转换成其他编码的字符串,eg name.encode(GB2312),表示将GB2312编码的字符串name转换成GB2312编码。

  例如,前面获取百度底部信息的例子。我还可以通过decode()encode()来解决:

#coding=utf-8from selenium import webdriverdriver = webdriver.Chrome()driver.get("http://www.baidu.com")# 返回百度页面底部备案信息text = driver.find_element_by_id("cp").texttext2 = text.encode("gbk","ignore").decode("gbk")print(text2)

   这里通过encode()Unicode编码转换成gbk编码,在转换的过程中通过“ignore”忽略掉gbk不能识别的字符(©),然后再把gbk转换成Unicode编码。当然,这并不是一种完美的方式,毕竟牺牲部分字符串。

 

 

chardet模块

 chardet是一个非常优秀的编码识别模块。

通过pip 安装:

>pip install chardet

 使用:

>>> from chardet import detect>>> a = "中文">>> detect(a){
'confidence': 0.682639754276994, 'encoding': 'KOI8-R'}

 大概有68%的把握为KOI8-R编码类型。

 

转载地址:http://aykkx.baihongyu.com/

你可能感兴趣的文章
java基础(1)
查看>>
ORACLE配置,修改tnsnames.ora文件实例
查看>>
用户无法在输入框中键入数字
查看>>
Workstation服务无法启动导致无法访问文件服务器
查看>>
.Net组件程序设计之远程调用(二)
查看>>
ant中文教程
查看>>
Linux常用命令(一)
查看>>
WSUS数据库远端存储条件下切换域及数据库迁移
查看>>
【VMCloud云平台】SCAP(四)租户(一)
查看>>
linux释放内存的方法
查看>>
基于 Android NDK 的学习之旅----- C调用Java
查看>>
Google 或强制 OEM 预装 20 款应用,给你一个不Root的理由
查看>>
我的友情链接
查看>>
双边过滤器(Bilateral filter)
查看>>
Android图形显示系统——下层显示4:图层合成上(合成原理与3D合成)
查看>>
Windows 10 技术预览
查看>>
Tomcat http跳转https
查看>>
一个自动布署.net网站的bat批处理实例
查看>>
tomcat 安装
查看>>
AIX:物理卷及有关概念
查看>>