You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python2.7含非ASCII字符代码报错,添加UTF-8声明仍无法解决

解决Python 2.x中Unicode编码报错的问题

看起来你踩了Python 2.x Unicode处理的几个典型坑,虽然加了UTF-8编码声明,但还有几个关键细节没处理到位,我来帮你梳理清楚:

核心问题分析

你最初遇到的SyntaxError: Non-ASCII character,以及后来的UnicodeDecodeError,本质上是两个问题叠加:

  1. 文件保存编码与声明不匹配:你在文件顶部加了# -*- coding: utf-8 -*-,但如果实际保存文件时用了GBK或其他编码,Python解释器用UTF-8读取文件内容时,就会把中文解析成乱码字节(比如回溯里的碌鈻捗兟∶�),后续处理自然报错。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:28:18