我正在使用 Python 脚本将文件从 gb2312
转换为 utf-8
。这个字符搞砸了一切:㎜
(它是一个符号,而不是“mm”)。
text = '㎜'
text.encode(encoding='gb2312')
引发此错误:
我可以通过
text.replace('㎜', 'mm')
使用解决方法。但是如果还有其他这样的角色呢?它有什么问题?为什么它如此特别?有没有办法让 Python 将其视为任何其他字符?
最佳答案
好的,所以,我下载了文件 1.php
并在其上运行了您的原始脚本,但收到了不同的错误消息:
UnicodeDecodeError: 'gb2312' codec can't decode bytes in position 99-100:
illegal multibyte sequence
文件中偏移量 99 和 100 处的字节依次为 A9 4C。这既不是有效的 GB2312 也不是有效的 UTF-8 编码。我怀疑您可能会遇到一堆据称是 GB2312 但实际上是其他编码的文件。如果你需要解决所有这些问题,你可以使用
errors='replace'
和 mode='rU'
(后者让 Python 理解你的 DOS 换行符)。file_old=open('1.php', mode='rU', encoding='gb2312', errors='replace')
这将插入
U+FFFD REPLACEMENT CHARACTER
代替它无法解码的任何内容,然后继续。 这会破坏数据 ;首先尝试弄清楚文件的真正编码是什么。顺便说一句,完成后不要忘记修复您的 HTML 标题;现在首选的形式是
<!doctype html>
<html><head>
<meta charset="utf-8">
简洁、符合标准,并经过测试可一直使用到 IE6。
编辑: 经过进一步调查,GB2312 是一个字符集,而不是一种编码。它有多种可能的编码,但只有一种允许两字节序列 A9 4C:在 Big5 中,它对应于字符
呶
。 (我不知道任何使用汉字的语言;这在上下文中比 ㎜
更有意义吗?)Python 和
iconv
假定 GB2312 以不同的格式 EUC-CN 编码,除非另有特别说明。如果我修改你的脚本来阅读file_old=open('1.php', mode='rU', encoding='big5', errors='strict')
file_new=open('2.php', mode='w', encoding='utf-8')
file_new.write(file_old.read())
然后它在您提供的
1.php
上执行而不会出错。编辑 2: 在进一步调查中,网络浏览器对
<meta charset="gb2312">
的作用是假装您编写了 <meta charset="gbk">
。 GBK 是 GB2312 的超集,它包含 ㎜
字符。然而,Python 按照其原始定义处理 GB2312。因此,为了让您的转换与原始文件匹配,您真正想要的是file_old=open('1.php', mode='rU', encoding='gbk', errors='strict')