python - 使用编译函数时出现UnicodeEncodeError

标签 python windows unicode python-3.x

在 Windows 7 中使用 python 3.2,我在 IDLE 中得到以下信息:

>>compile('pass', r'c:\temp\工具\module1.py', 'exec')
UnicodeEncodeError: 'mbcs' codec can't encode characters in position 0--1: invalid character

谁能解释为什么编译语句会尝试使用 mbcs 转换 unicode 文件名?我知道 sys.getfilesystemencoding 在 Windows 中返回 'mbcs',但我认为在提供 unicode 文件名时不会使用它。

例如:

f = open(r'c:\temp\工具\module1.py') 

有效。

要进行更完整的测试,请将以下内容保存在 utf8 编码文件中,并使用标准 python.exe 版本 3.2 运行它

# -*- coding: utf8 -*-
fname = r'c:\temp\工具\module1.py'
# I do have the a file named fname but you can comment out the following two lines
f = open(fname)
print('ok')
cmp = compile('pass', fname, 'exec')
print(cmp)

输出:

ok
Traceback (most recent call last):
  File "module8.py", line 6, in <module>
    cmp = compile('pass', fname, 'exec')
UnicodeEncodeError: 'mbcs' codec can't encode characters in position 0--1: inval
id character

最佳答案

来自 Python issue 10114 ,似乎逻辑是 Python 使用的所有文件名都应该对使用它们的平台有效。它使用文件系统编码进行编码,以便在 Python 的 C 内部使用。

我同意它可能不应该在 Windows 上引发错误,因为任何 Unicode 文件名都是有效的。为此,您可能希望使用 Python 提交错误报告。但请注意,必要的更改可能并非微不足道,因为如果无法编码,任何使用文件名的 C 代码都必须做一些事情。

关于python - 使用编译函数时出现UnicodeEncodeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8798591/

相关文章:

python - 无法在 Windows cmd 中添加 Python

python - 为什么 np.where & np.min 似乎不能正确处理这个数组?

python - 如何仅对数据集的特定列进行标签编码?

python - mysqldb-python 并没有真正更新原始数据库

Python3 - 附加到不包含某些单词的数组行

windows - 批处理脚本循环当前目录中特定类型的文件并获取最新创建的文件和下一个最新创建的文件等

linux - native Windows Linux

php - 使用 PHP 转换所有类型的智能引号

java - 使用Java,这个charAt();怎么样?将字符串转换为整数?

mysql - 呈现 : 'ascii' codec can't encode characters in position 4-5: ordinal not in range(128) 时捕获 UnicodeEncodeError