Python2.7含非ASCII字符代码报错,添加UTF-8声明仍无法解决
解决Python 2.x中Unicode编码报错的问题
看起来你踩了Python 2.x Unicode处理的几个典型坑,虽然加了UTF-8编码声明,但还有几个关键细节没处理到位,我来帮你梳理清楚:
核心问题分析
你最初遇到的SyntaxError: Non-ASCII character,以及后来的UnicodeDecodeError,本质上是两个问题叠加:
- 文件保存编码与声明不匹配:你在文件顶部加了
# -*- coding: utf-8 -*-,但如果实际保存文件时用了GBK或其他编码,Python解释器用UTF-8读取文件内容时,就会把中文解析成乱码字节(比如回溯里的碌鈻捗兟∶�),后续处理自然报错。 - Python 2.x的字符串类型混淆:Python 2里
str是字节串,unicode是文本串,你错误使用unicode('...')时,Python默认用ASCII编码去解码字节串,遇到非ASCII字节直接抛出解码错误。
分步解决方案
1. 确保文件以UTF-8编码保存
这是最基础的一步,不管你用什么编辑器:
- VS Code:右下角点击编码选择框,选择"UTF-8",保存时确认
- Notepad++:顶部菜单「编码」→「UTF-8」(不要选「UTF-8-BOM」,Python 2对BOM支持不好)
- Sublime Text:「File」→「Save with Encoding」→「UTF-8」
2. 修正代码中的问题
你的代码里有两个小问题,我给你调整后的完整版本:
#!/usr/bin/env python # -*- coding: utf-8 -*- import re # 直接用u''定义Unicode字符串,前提是文件已保存为UTF-8 s = u'The best 姹夊瓧 interests of the Aboriginal child in family law proceedings. Australian Journal of Family Law 12 140149.' def cleanup(s): # 生成Unicode类型的控制字符集合 control_chars = ''.join(map(unichr, range(0,9) + range(11,13) + range(14,32) + range(127,160))) # 编译正则时用Unicode模式,确保和输入的Unicode字符串匹配 cc_regex = re.compile(u'[%s]' % re.escape(control_chars)) return cc_regex.sub(u' ', s) # 打印时转成UTF-8字节串,避免Windows终端默认GBK编码导致的乱码 print cleanup(s).encode('utf-8')
3. 处理终端输出兼容性
Windows命令行默认编码是GBK,直接打印Unicode字符串可能会乱码,你可以二选一:
- 按代码里的方式,打印前用
encode('utf-8')转成UTF-8字节串 - 先执行
chcp 65001把终端编码切换到UTF-8,再运行脚本
你之前尝试的写法错误点
unicode(The best 姹夊瓧 ...):字符串没有用引号括起来,属于语法错误;就算加了引号,unicode('...')默认用ASCII解码,同样会报错,正确写法是unicode('...', 'utf-8')(但不如直接用u'...'简洁)gettext.ugettext((The best ...)):同样缺少引号,而且gettext是做国际化翻译的工具,和当前的编码问题无关,完全用错了地方
内容的提问来源于stack exchange,提问作者Kenobi
相关产品推荐
相关产品推荐

