Python读取UTF-8文本文件的问题

1 投票
2 回答
3363 浏览
提问于 2025-04-15 23:05

我在使用Python读取和打印UTF-8文本文件时遇到了问题。

我有一个名为test.txt的文件,它是UTF-8编码的,没有BOM。这文件里有两个字符:

大声

第一个字符是“大”,是中文;第二个字符是“声”,是日文。现在,当我用Ulipad(一个Python编辑器)运行以下代码来读取这个文本文件,并打印这两个字符时,

import codecs
infile = "C:\\test.txt"

f = codecs.open(infile, "r", "utf-8")
s = f.read()

print(s)

我遇到了一个错误,

"UnicodeEncodeError: 'cp950' codec can't encode character '\u58f0' in position 1:
 illegal multibyte sequence"

我发现这个错误是由第二个字符“声”引起的。

但是当我在Python的默认图形界面IDLE中用同样的代码测试时,它可以正常打印这两个字符,没有任何错误。那么,我该如何解决这个问题呢?

我的运行环境是Python 3.1,Windows XP繁体中文。

2 个回答

0

“声”这个字虽然是日语,但在简体中文里也表示“声音”(繁体字是“聲”)。cp950是繁体中文的编码,不支持这个简体字。

因为你使用的是中文版的Windows,你可以试着把默认的编码改成cp936(统一中文),这样可能就能看到正确的输出。

我对Ulipad不太熟悉,但你可以试着在Windows的命令行里运行:

chcp 936

然后再运行你的脚本。如果这样不行,你可以通过控制面板,找到区域和语言选项,进入高级选项来更改非Unicode程序的默认语言。这就是我在美国英语版Windows上能在命令行里打印中文的方法。

更新

关于Ulipad的资料显示:

多语言支持 目前支持4种语言:英语、西班牙语、简体中文和繁体中文,这些语言可以自动识别。

也许你可以把自动识别的繁体中文改成简体中文,这样可能会选择一个支持这个特定字符的编码或字体。不过因为它不支持日语,可能还是会有一些字符无法正常显示。

7

你在打印的时候遇到这个错误是因为:

(1) Ulipad 是在向 sys.stdout 打印,而 sys.stdout 是老旧的 MS-DOS 命令提示符窗口的输出。

(2) 你的传统中文 Windows XP 使用的是 cp950 编码,这种编码是 big5 加上一些微软的调整。

(3) 你说你的第二个字符是日文,可能是因为你认为它不是中文,所以在 big5+ 编码中不太可能是有效字符。

另一方面,IDLE 是在自己的窗口中写入内容,不受 MS-DOS 的限制 :-) ... 所以它可以打印的字符种类要多得多。

撰写回答