我正在使用 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')

10-06 10:34