Python读取UTF-8文本文件的问题
我在使用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 个回答
“声”这个字虽然是日语,但在简体中文里也表示“声音”(繁体字是“聲”)。cp950是繁体中文的编码,不支持这个简体字。
因为你使用的是中文版的Windows,你可以试着把默认的编码改成cp936(统一中文),这样可能就能看到正确的输出。
我对Ulipad不太熟悉,但你可以试着在Windows的命令行里运行:
chcp 936
然后再运行你的脚本。如果这样不行,你可以通过控制面板,找到区域和语言选项,进入高级选项来更改非Unicode程序的默认语言。这就是我在美国英语版Windows上能在命令行里打印中文的方法。
更新
关于Ulipad的资料显示:
多语言支持 目前支持4种语言:英语、西班牙语、简体中文和繁体中文,这些语言可以自动识别。
也许你可以把自动识别的繁体中文改成简体中文,这样可能会选择一个支持这个特定字符的编码或字体。不过因为它不支持日语,可能还是会有一些字符无法正常显示。
你在打印的时候遇到这个错误是因为:
(1) Ulipad 是在向 sys.stdout 打印,而 sys.stdout 是老旧的 MS-DOS 命令提示符窗口的输出。
(2) 你的传统中文 Windows XP 使用的是 cp950 编码,这种编码是 big5 加上一些微软的调整。
(3) 你说你的第二个字符是日文,可能是因为你认为它不是中文,所以在 big5+ 编码中不太可能是有效字符。
另一方面,IDLE 是在自己的窗口中写入内容,不受 MS-DOS 的限制 :-) ... 所以它可以打印的字符种类要多得多。