Qia*_*iao 4 python unicode encoding gb2312 python-3.x
我正在使用Python脚本将文件转换gb2312为utf-8.这个角色混淆了一切:( ?它是一个符号,而不是"mm").
text = '?'
text.encode(encoding='gb2312')
Run Code Online (Sandbox Code Playgroud)
引发此错误:
UnicodeEncodeError:'gb2312'编解码器无法对位置1中的字符'\ u040b'进行编码:非法多字节序列
我可以使用解决方法text.replace('?', 'mm').但如果有其他人这样的角色怎么办?这有什么问题?为什么这么特别?
有没有办法让Python将其视为任何其他角色?
zwo*_*wol 11
好的,所以,我下载了文件1.php并在其上运行了原始脚本,我得到了一个不同的错误消息:
UnicodeDecodeError: 'gb2312' codec can't decode bytes in position 99-100:
illegal multibyte sequence
Run Code Online (Sandbox Code Playgroud)
偏移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')
Run Code Online (Sandbox Code Playgroud)
这将插入U+FFFD REPLACEMENT CHARACTER代替无法解码的任何内容,并继续. 这会破坏数据 ; 首先尝试弄清楚文件的实际编码是什么.
顺便说一句,在完成后不要忘记修改HTML标题; 现在的首选形式是
<!doctype html>
<html><head>
<meta charset="utf-8">
Run Code Online (Sandbox Code Playgroud)
简洁,标准兼容,并经过测试,可以一直回到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())
Run Code Online (Sandbox Code Playgroud)
然后它会在1.php你提供的时候没有错误地执行.
编辑2:在进一步深入调查,哪些Web浏览器与做的<meta charset="gb2312">就是假装你写的<meta charset="gbk">. GBK是GB2312的一个超集,它不包含?字符.但是,Python根据其原始定义处理GB2312.因此,为了使您的转换与原始文件匹配,您真正想要的是
file_old=open('1.php', mode='rU', encoding='gbk', errors='strict')
Run Code Online (Sandbox Code Playgroud)