python windows下中文乱码怎么解决
中文编码问题是用中文的程序员经常头大的问题,在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编码内部处理使用。
相关推荐:《Python入门教程》
二、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()来说,这个方法比较不容易在编码上出现问题。
所以可以在读取的时候指定编码,这样可以避免很多问题。
来源:PY学习网:原文地址:https://www.py.cn/article.html