我正在使用 Python 脚本将文件从 gb2312
转换为 utf-8
。这个字符弄乱了一切:㎜
(它是一个符号,不是“mm”)。
text = '㎜'
text.encode(encoding='gb2312')
引发此错误:
UnicodeEncodeError: 'gb2312' codec can't encode character '\u040b' in position 1: illegal multibyte sequence
我可以通过 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 也不是有效的 anything 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 header ;现在的首选形式是
<!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')
关于python - 这个字符 - ㎜ - 引发 UnicodeEncodeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13553185/