python - 这个字符 - ㎜ - 引发 UnicodeEncodeError

标签 python unicode encoding python-3.x gb2312

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

相关文章:

python - 将图像转换为值矩阵

python - 如何从另一个 Python 脚本内部运行一个 Python 脚本?

python - 重新启动后的Django docker-compose需要再次迁移

c# - 将未知字符转换为希腊字符

Javadoc 错误 : unmappable character for encoding ASCII

c - JNI 函数在 android 上返回非法的 UTF 字符

python - 段错误捕获

python - 在python中的拉丁文之前对西里尔文字符串进行排序

python - Python 2.7 中的 Unicode 西里尔字母字符串

Delphi Unicode 字符串长度(以字节为单位)