设置python的默认编码为utf8

本文详细介绍了如何在Python中设置默认编码为utf8,包括在不同操作系统下的操作步骤及注意事项。此外,还提供了在Windows环境下修改sitecustomize.py文件的方法,并通过实例展示了如何解决在对话框中显示中文及数据库连接时中文乱码问题。文章最后总结了连接数据库时确保中文正常显示的常见方法。

(这部分转自南瓜小米粥的博客):

这是Python的编码问题,设置python的默认编码为utf8

python安装目录:/etc/python2.x/sitecustomize.py
 
1 import sys
2 reload(sys)
3 sys.setdefaultencoding('utf-8')
4 try:
5     import apport_python_hook
6 except ImportError:
7     pass
8 else:
9     apport_python_hook.install()
如果在windows下:
可以在Python安装目录下的Lib/site-packages目录中,新建一个sitecustomize.py文件(也可以建在其它地方,然后手工导入,建在这里,每次启动Python的时候设置将自动生效),内容如下:
1 import sys
2 sys.setdefaultencoding('utf-8'#set default encoding to utf-8
然后可以查看到改变已经生效
1 >>> import sys
2 >>> sys.getdefaultencoding()
3 'utf-8'
此时运行程序,如果仍然报告之前的错误,只需要显示地设定输出的编码
1 print s.encode('utf-8')
就可以看到正确显示。



---------------------------
此部分转自:http://blog.youkuaiyun.com/a6225301/article/details/43406373

网上有很多说法,有的说在标题加入东西,有的还有其他,如果奏效的话是可以的。

对于对话框,大家可以用pyqt自动生成的代码:

[python]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. try:  
  2.     _fromUtf8 = QtCore.QString.fromUtf8  
  3. except AttributeError:  
  4.     def _fromUtf8(s):  
  5.         return s  
  6.   
  7.   
  8. try:  
  9.     _encoding = QtGui.QApplication.UnicodeUTF8  
  10.     def _translate(context, text, disambig):  
  11.         return QtGui.QApplication.translate(context, text, disambig, _encoding)  
  12. except AttributeError:  
  13.     def _translate(context, text, disambig):  
  14.         return QtGui.QApplication.translate(context, text, disambig)  
[python]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. QtGui.QMessageBox.about(self,(_fromUtf8("恭喜您!")), (_fromUtf8("恭喜您,您的验证码通过,请您及时领取奖品!")))  
[python]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. _fromUtf8("恭喜您,您的验证码通过,请您及时领取奖品!")  

用上面的那句就可以完美解决。


另外对于连接数据库,中文出现问号,解决如下:

以前用php连mssqy时也经常出现中文乱码(中文变问号)的问题,那时就明白是编码没设置好导航,现在的Python连mssql数据库也同样出现这问题,问题一样,解决的办法当然也会相似,现在我们来看看解决方法。

python一直对中文支持的不好,最近老遇到编码问题,而且几乎没有通用的方案来解决这个问题,但是对常见的方法都试过之后,发现还是可以解决的,下面总结了常用的支持中文的编码问题(这些方法中可能其中一个就能解决问题,也可能是多个组合)。

(1)、首先,要保证文件的开头要加上编码设置来说明文件的编码

 代码如下 复制代码
#encoding=utf-8



(2)、然后,在连接数据的连接参数里加上字符集说明查询出的结果的编码,这个不加的后果可能是查询出的汉字字符都是问号

 代码如下 复制代码
conn=pymssql.connect(server='.',user='', password='',database='MyTest',charset='utf8')



(3)、设置python系统的默认编码(对于文件来说,这招几乎屡试不爽,呵呵~~)

 代码如下 复制代码

import sys
reload(sys)
sys.setdefaultencoding('utf8')



注意:上述编码是“utf8”,而不是“utf-8”,我也没弄明白,大部分情况下,这个无所谓的,但是这里我试了必须要是“utf8”

一个简单的完整的python连接mssqlserver的例子如下(得安装pymssql包):

 代码如下 复制代码
#encoding:utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
import pymssql
try:
    conn=pymssql.connect(server='.',user='', password='',database='MyTest',charset='utf8')
    sql="select * from UserInfo"

    cur=conn.cursor()
    cur.execute(sql)
    data=cur.fetchall()
    conn.close()
    print data
except Exception,e:
    print e



运行结果如下:

 代码如下 复制代码

[(u'20093501', u'xb9xf9xbexb8', u'u7537 ', 35, u'xb4xf3xcfxc0'),
 (u'20093502', u'xbbxc6xc8xd8', u'u5973 ', 34, u'xc3xc0xc5xae'),
 (u'20093503', u'xc1xeexbaxfcxb3xe5', u'u7537 ', 25, u'2Bxc7xe0xc4xea'),
 (u'20093504', u'xc8xcexd3xafxd3xaf', u'u5973 ', 24, u'xc6xafxc1xc1')]
 [Finished in 0.2s]


 虽然摆脱了问号和乱码的困扰,但这仍不是我们想要的结果,但这个确实是正确的,因为结果是utf8编码。这个现象确实诡异,请教了许多高手,得知,最好的结果就是逐个字段查询,才能显示中文,整个查询的话,会以utf8的格式显示出来。

上述代码中第14行data是整个查询的结果,如果指定某个具体的字段,如print data[0][2](表示取查询结果的第一行第三列的字段的值),则会输出中文。

其实不仅仅是mssqlserver数据库,mysql(需下载MySQLdb包)、sqllite(python自带的文件数据库)、mongodb(需下载PyMongo包)等或者是普通文本文件也是类似的解决方案。


<think>嗯,用户的问题是关于如何在Python文件中设置编码为UTF-8。我需要先回顾之前的对话,确保回答的一致性和连贯性。之前用户问的是如何在macOS下用PyInstaller打包Python应用,现在转向了文件编码设置,这可能与他们在处理文件时遇到的编码问题有关。 首先,用户提到的引用内容显示他们可能已经尝试过使用chardet检测编码,并且需要转换JSONL文件到UTF-8。现在他们想了解如何设置Python文件本身的编码。根据Python的规范,文件编码通常在文件头用注释声明,比如`# -*- coding: utf-8 -*-`。不过Python 3默认已经是UTF-8,所以可能不需要显式声明,但为了兼容性或明确性,用户可能还是想设置。 接下来需要考虑用户的实际需求。他们可能遇到编码错误,比如在读取或写入文件时出现UnicodeDecodeError,或者脚本中有非ASCII字符导致解析问题。这时候正确设置文件编码和正确处理文件操作中的编码就很重要了。 另外,引用中提到的使用codecs模块和open函数的encoding参数,这些都是处理文件读写时设置编码的方法。需要向用户说明在文件操作中指定编码的重要性,特别是当文件不是UTF-8时,比如使用gb18030或其他编码的情况。 还要注意用户可能遇到的常见问题,比如文件头声明与实际编码不一致,或者在不同操作系统下的行为差异。例如,Windows默认编码可能是cp1252,而macOS和Linux是UTF-8,这可能导致脚本在不同环境下的表现不同。 需要分步骤解释:首先如何声明Python文件的编码,然后是文件读写时如何指定编码,接着是处理编码检测和转换,以及常见问题的解决方案。同时,结合之前的引用内容,用户可能已经了解了一些编码转换的方法,现在需要将这些知识应用到设置Python文件本身的编码上。 此外,用户可能对错误处理感兴趣,比如如何处理未知字符,使用`errors='ignore'`或`errors='replace'`参数,但需要提醒谨慎使用这些选项,因为它们可能导致数据丢失或损坏。 最后,确保回答结构清晰,步骤明确,涵盖声明编码、读写文件时的编码设置、处理异常情况以及最佳实践。这样用户能全面了解如何在不同环节设置和处理编码问题,避免常见的错误。</think>在Python设置文件编码为UTF-8需要从两个层面处理:Python脚本自身的编码声明和文件操作时的编码控制。以下是具体实现方法: ### 一、Python脚本编码声明(强制规范) 1. **文件头声明**(Python 3推荐方式) ```python # -*- coding: utf-8 -*- # 或简写为 # coding: utf-8 ``` 此声明必须出现在脚本前两行,建议放在第一行注释下方[^3] 2. **现代Python默认支持**(Python 3.7+) Python 3默认使用UTF-8编码,但显式声明可确保跨平台一致性: ```python #!/usr/bin/env python3 # coding: utf-8 ``` ### 二、文件操作编码控制 1. **基础读写规范** ```python with open("file.txt", "r", encoding="utf-8") as f: # 读取时明确编码 content = f.read() with open("output.txt", "w", encoding="utf-8") as f: # 写入时强制UTF-8 f.write(content) ``` 2. **编码自动检测**(推荐使用chardet库) ```python import chardet def detect_encoding(file_path): with open(file_path, 'rb') as f: rawdata = f.read(10000) # 读取前10KB检测编码 result = chardet.detect(rawdata) return result['encoding'] ``` ### 三、特殊场景处理 1. **BOM头处理**(Windows常见问题) ```python # 写入时忽略BOM with open("file.txt", "w", encoding="utf-8-sig") as f: f.write("内容") # 读取时兼容BOM with open("file.txt", "r", encoding="utf-8-sig") as f: content = f.read() ``` 2. **容错处理机制** ```python # 忽略无法解码的字符(谨慎使用) with open("file.txt", "r", encoding="utf-8", errors='ignore') as f: content = f.read() # 替换非法字符 with open("file.txt", "r", encoding="utf-8", errors='replace') as f: content = f.read() ``` ### 四、编码转换实践 结合引用[1][2]中的方法,实现安全转换: ```python import os from chardet import detect def convert_to_utf8(src_path, dst_path=None): """安全编码转换函数""" # 自动检测源文件编码 with open(src_path, 'rb') as f: rawdata = f.read() encoding = detect(rawdata)['encoding'] or 'utf-8' # 读取并转换编码 try: with open(src_path, 'r', encoding=encoding, errors='replace') as f: content = f.read() except UnicodeDecodeError: # 尝试GB18030编码中文环境常见问题) with open(src_path, 'r', encoding='gb18030', errors='replace') as f: content = f.read() # 写入目标文件 target_path = dst_path or src_path with open(target_path, 'w', encoding='utf-8') as f: f.write(content) ``` ### 五、开发环境配置 1. **PyCharm设置**: - 进入 `Preferences > Editor > File Encodings` - 设置 `Global Encoding`、`Project Encoding` 和 `Default encoding for properties files` 为UTF-8 2. **VS Code配置**: 在settings.json中添加: ```json "files.encoding": "utf8", "files.autoGuessEncoding": true ``` ### 常见问题解决 1. **SyntaxError: Non-UTF-8 code** 错误: - 确认文件头声明`# coding: utf-8`存在 - 检查编辑器实际保存编码是否为UTF-8 2. **UnicodeDecodeError** 处理: - 优先尝试`gb18030`编码(兼容GBK和GB2312)[^4] - 使用错误替换策略:`errors='replace'` 3. **Windows系统特殊问题**: ```python import sys sys.stdout.reconfigure(encoding='utf-8') # 解决控制台输出乱码 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值