python windows下中文乱码怎么解决

512次阅读
没有评论

python

中文编码问题是用中文的程序员经常头大的问题,在python下也是如此。

我们要知道python内部使用的是unicode编码,而外部却要面对千奇百怪的各种编码,比如作为中国程序经常要面对的gbk,gb2312,utf8等,那这些编码是怎么转换成内部的unicode呢?

一、源代码文件的编码格式

python默认会认为源代码文件是asci编码。

s1='hello'
print s1

python认为这个'hello'就是一个asci编码的字符。在仅仅使用英文字符的情况下一切正常,但是如果用了中文,比如:

s1='你好'
print s1

这个代码文件被执行时就会出错。python默认将代码文件内容当作asci编码处理,但asci编码中不存在中文,因此抛出异常。

解决方法就是让python知道文件中使用的是什么编码。只需在代码文件的最前端添加如下:

# -*- coding: utf-8 -*-

表示我这个文件里的文本是用utf-8编码的,这样,python就会依照utf-8的编码形式解读其中的字符,然后转换成unicode编码内部处理使用。

二、windows下控制台编码

Python 的 print 语句。它的功能是向控制台输出字符,这本身不是问题。但是 Python 内部是支持 Unicode 字符串的,而 Unicode 字符串在用 print 输出时 print 要进行一次从 Unicode 到 ANSI/MBCS 编码的编码,编码后才会以 8-bit 流输出结果。

编码就编码吧,这也是很正常的。对于控制台程序来说,输出可能被重定向到文本文件。如果不指定编码,重定向时就不知道以何种 8-bit 字节流写入文本文件,所以,输出到控制台的东西理论上也应该是经过编码的 8-bit 流。综上所述,确实有必要进行一次 WCHAR 到 char 的转码。

但是问题在于,Python 的 print 语句在转码时,居然用的是 strict 规则。即,待输出字符串若含有当前代码页之外的字符,就会在转码过程中出现不可转码的文字,从而抛出 exception。print 语句又不处理这个 exception,导致一个平平常常 print 语句竟然会引起 Python 程序的异常!

解决方法:CHCP

CHCP是MS DOS中的命令,用来显示或设置活动代码页编号的。

用法是:CHCP [nnn]

其中nnn指定的是代码页的编号。这个参数是可选的,在命令行下如果不指定这个代码页编号,那么默认是显示当前的代码页编号。比如,在默认的cmd窗口中,我们输入chcp,显示的将类似:

活动的代码页: 936

这里的936表示当前使用的是简体中文(GB2312)编码。如果输出的字符在代码页之内,就不会出现问题。如果出现了,可以:

运行CMD;

输入 CHCP,回车查看当前的编码;

输入CHCP 65001,回车;(指定为utf-8)

这时候,你的Console里面,应该支持UTF8了。

三、文件读取

其中,关于open的编码解释如下:

读取时:内置的open()方法打开文件时,read()读取的是str,读取后需要使用正确的编码格式进行decode()。write()写入时,如果参数是unicode,则需要使用你希望写入的编码进行encode(),如果是其他编码格式的str,则需要先用该str的编码进行decode(),转成unicode后再使用写入的编码进行encode()。如果直接将unicode作为参数传入write()方法,Python将先使用源代码文件声明的字符编码进行编码然后写入。

编码时:模块codecs提供了一个open()方法,可以指定一个编码打开文件,使用这个方法打开的文件读取返回的将是unicode。写入时,如果参数是unicode,则使用open()时指定的编码进行编码后写入;如果是str,则先根据源代码文件声明的字符编码,解码成unicode后再进行前述操作。相对内置的open()来说,这个方法比较不容易在编码上出现问题。

所以可以在读取的时候指定编码,这样可以避免很多问题。

神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试

相关文章:

版权声明:wuyou2021-06-28发表,共计1673字。
新手QQ群:570568346,欢迎进群讨论 Python51学习