【发布时间】:2012-04-18 01:55:48
【问题描述】:
我有一个主要是 UTF-8 的文件,但也发现了一些 Windows-1252 字符。
我创建了一个表格来将 Windows-1252 (cp1252) 字符映射到对应的 Unicode 字符,并希望使用它来修复错误编码的字符,例如
cp1252_to_unicode = {
"\x85": u'\u2026', # …
"\x91": u'\u2018', # ‘
"\x92": u'\u2019', # ’
"\x93": u'\u201c', # “
"\x94": u'\u201d', # ”
"\x97": u'\u2014' # —
}
for l in open('file.txt'):
for c, u in cp1252_to_unicode.items():
l = l.replace(c, u)
但是尝试以这种方式进行替换会导致引发 UnicodeDecodeError,例如:
"\x85".replace("\x85", u'\u2026')
UnicodeDecodeError: 'ascii' codec can't decode byte 0x85 in position 0: ordinal not in range(128)
关于如何处理这个问题的任何想法?
【问题讨论】:
-
怀疑它会解决你的问题,但
str.translate()比一堆替换更适合你想要做的事情。例如:cp1252_to_unicode = string.maketrans({...})然后l.translate(cp1252_to_unicode)。 -
很难相信只有那些 Windows 标点字符原来是 cp1252...你知道混淆是怎么发生的吗?您确定您的 UTF8 编码字符解码为 * 有意义的 * unicode 吗?文字是用什么语言写的?
-
不幸的是,我没有太多关于文件如何损坏的信息。这些文件是用英文编写的,最初可能没有编码为 Unicode,而只是编码为 Ascii(99% 的文本是纯 Ascii)。我猜想在 Windows 上工作的人使用为他们这样做的编辑器或使用 alt- 快捷方式插入了字符(破折号等)。我手动查找了 Unicode 字符,所以如果它们被用作替换并且文件读取为 Unicode,这些应该可以工作。
标签: python unicode encoding utf-8 windows-1252