自己最近有在学习python,这实在是一门非常短小精悍的语言,很喜欢这种语言精悍背后又有强大函数库支撑的语言。可是刚接触不久就遇到了让人头疼的关于编码的问题,在网上查了很多资料现在在这里做一番总结,权当一个记录也为后来的兄弟姐妹们服务,如果可以让您少走一些弯路本人将倍感荣幸。
先来描述下现象吧:
import os for i in os.listdir("E:\Torchlight II"): print i
代码很简单我们使用os的listdir函数遍历了E:\Torchlight II这个目录(Torchlight ?! :)),由于这个目录下有些文件是以中文命名的,所以在最后print结果时出现了乱码,像这样:
那么问题出在哪儿呢? 别急,我们一点一点来分析它。
从这里和这里我们几乎能够肯定的知道问题是出在:
This means that the python console app can't write the given character to the console's encoding. More specifically, the python console app created a _io.TextIOWrapperd instance with an encoding that cannot represent the given character. sys.stdout --> _io.TextIOWrapperd --> (your console)
看到这里不知你是否与我想的一样,能不能去设置console的编码,将其设置为能够理解中文字符的编码不就可以正常的显示出中文了吗?等等,让我们在多Google一会儿,
Python determines the encoding of stdout and stderr based on the value of the LC_CTYPE variable, but only if the stdout is a tty. So if I just output to the terminal, LC_CTYPE (or LC_ALL) define the encoding. However, when the output is piped to a file or to a different process, the encoding is not defined, and defaults to 7-bit ASCII.
更详细的说明如下:
1). When Python finds its output attached to a terminal, it sets the sys.stdout.encoding attribute to the terminal's encoding. The print statement's handler will automatically encode unicode arguments into str output. 2). When Python does not detect the desired character set of the output, it sets sys.stdout.encoding to None, and print will invoke the "ascii" codec.
嚯嚯,看来刚才的想法是可行的只是不太优雅罢了,因为我们得去修改系统的设置。事实上上面的论述是基于linux环境的,在linux下可能需要我们去更改某个环境变量的值(LC_CTYPE or LANG);如果我们是在windows下面的话,console的编码设置是跟操作系统的区域设置相关的。比如在中文的win7环境下,console默认的编码就是GBK(cp936)。你可以试试下面的代码:
import locale print locale.getdefaultlocale()[1]
console的编码不好设置了那能否对stdout.out.encoding进行设置以达到我们的目的呢?很遗憾,答案是否定的,这家伙压根就是只读的:
没有办法了么?不会,其实我们离成功已经很近了,来,根据上面检索到的那些资料分析整理下看看我们现在掌握到的情况都有哪些:
1). console不能正常显示中文,console的编码是由操作系统决定的(windows环境下); 2). 我的操作系统是win7中文版(GBK),enc = locale.getdefaultlocale()[1]; 3). console的编码决定了sys.stdout.encoding的取值,sys.stdout.encoding = utf-8; 4). 从操作系统枚举目录(E:\Torchlight II)列表返回的字符串也是GBK编码
是不是已经看出问题来了。最上面截图中那么奇奇怪怪的问号尖角符号就是因为字符串本身是按照gbk进行编码的,但是由于sys.stdout.encoding = utf-8,导致print会按照utf-8对input的数据进行encode从而转换为unicode字符。这,当然错误了。原因已经清楚了,来改改代码吧:
import os for i in os.listdir("E:\Torchlight II"): print i.decode('gbk')
在代码中我们手动告诉了python对读入的字符串按章gbk编码来进行解码,而这一个动作之后数据已经是标准的unicode字符了,可以放心的交给print去打印输出了(即使这会儿sys.stdout.encoding = utf-8):
ps:
实际在google中还查到过很多相关的类似编码的问题,比如这里的,还有这里的。虽然问题的样子千变万化并且解决方式多种多样甚至是python自己的特定解决方式,比如这里。但这些问题本质都是一样的都是关于字符的编码和解码,搞清楚了其中的本质所有问题都能够迎刃而解。
以上这篇Python编码爬坑指南(必看)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。
相比开发普通的 Web 应用,在开发 SSR 应用时,端上环境和渲染机制的差异,会对编码带来一些约束: 状态管理 Server 端的渲染过程是一个同步的操作,其本质是将 JSX 组件渲染为 HTML 字符串。 setState 、 hooks 这类对组件异步更新状态的方法,以及组件的 生命周期 方法,在 Server 端不会被执行。 开发过程中,应尽量避免将用于渲染初始页面的状态,通过异步的方式来
This document describes the coding guidelines for the Libra Core Rust codebase. Code Formatting All code formatting is enforced with rustfmt using a project specific configuration. Here is a sample co
JavaScript-StepPitGuide《JavaScript踩坑指南》,那些说前端简单的什么的最变态了,可以说 JavaScript 是世界上最复杂的语言。
本文向大家介绍python scrapy爬虫代码及填坑,包括了python scrapy爬虫代码及填坑的使用技巧和注意事项,需要的朋友参考一下 涉及到详情页爬取 目录结构: kaoshi_bqg.py xmly.py item.py pipelines.py starts.py 然后是爬取到的数据 小说 xmly.json 记录一下爬取过程中遇到的一点点问题: 在爬取详情页的的时候, 刚开始不知道
Android的视频相关的开发,大概一直是整个Android生态,以及Android API中,最为分裂以及兼容性问题最为突出的一部分。摄像头,以及视频编码相关的API,Google一直对这方面的控制力非常差,导致不同厂商对这两个API的实现有不少差异,而且从API的设计来看,一直以来优化也相当有限,甚至有人认为这是“Android上最难用的API之一” 以微信为例,我们录制一个540p的mp4文
本文向大家介绍Python 爬虫之Beautiful Soup模块使用指南,包括了Python 爬虫之Beautiful Soup模块使用指南的使用技巧和注意事项,需要的朋友参考一下 爬取网页的流程一般如下: 选着要爬的网址(url) 使用 python 登录上这个网址(urlopen、requests 等) 读取网页信息(read() 出来) 将读取的信息放入 BeautifulSoup 使用