此字符 - ㎜ - 引发UnicodeEncodeError

时间:2012-11-25 16:54:15

标签: python unicode encoding python-3.x gb2312

我正在使用Python脚本将文件从gb2312转换为utf-8。这个角色会混淆一切:(它是一个符号,而不是“mm”)。

text = '㎜'
text.encode(encoding='gb2312')

引发了这个错误:

  

UnicodeEncodeError:'gb2312'编解码器无法对位置1中的字符'\ u040b'进行编码:非法多字节序列

我可以使用text.replace('㎜', 'mm')的解决方法。但如果有其他人这样的角色怎么办?这有什么问题?为什么这么特别?

有没有办法让Python将其视为任何其他角色?

1 个答案:

答案 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。因此,为了使您的转换与原始文件匹配,您真正想要的是