我正在使用Python脚本将文件从gb2312
转换为utf-8
。这个角色会混淆一切:㎜
(它是一个符号,而不是“mm”)。
text = '㎜'
text.encode(encoding='gb2312')
引发了这个错误:
UnicodeEncodeError:'gb2312'编解码器无法对位置1中的字符'\ u040b'进行编码:非法多字节序列
我可以使用text.replace('㎜', 'mm')
的解决方法。但如果有其他人这样的角色怎么办?这有什么问题?为什么这么特别?
有没有办法让Python将其视为任何其他角色?
答案 0 :(得分:11)
好的,所以,我下载了文件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">
所做的是假装您写的{{1} }。 GBK是GB2312的超集, 包含<meta charset="gbk">
字符。但是,Python根据其原始定义处理GB2312。因此,为了使您的转换与原始文件匹配,您真正想要的是
㎜