ANSI、ASCII、Unicode和Python编码混淆
我很高兴地使用了BeautifulSoup,并且还使用了一个文本文件作为Python脚本的输入参数 然后我遇到了著名的“UnicodeError”错误 我一直在读SO的问题,但我还是很困惑 ASCII与所有这些有什么关系? 我在文本编辑器(记事本++)上使用什么编码?ANSI?UTF-8? 将字符串解码为ASCII似乎并不总是有效(我猜该字符串使用的是来自BeautifulSoup的不同编码)。我该如何解决这个问题 无论如何,任何帮助和澄清都将不胜感激 谢谢 编辑: 在阅读BeautifulSoup的文档时,它说它只使用unicode,但我仍然发现unicode错误:(ANSI、ASCII、Unicode和Python编码混淆,python,unicode,beautifulsoup,Python,Unicode,Beautifulsoup,我很高兴地使用了BeautifulSoup,并且还使用了一个文本文件作为Python脚本的输入参数 然后我遇到了著名的“UnicodeError”错误 我一直在读SO的问题,但我还是很困惑 ASCII与所有这些有什么关系? 我在文本编辑器(记事本++)上使用什么编码?ANSI?UTF-8? 将字符串解码为ASCII似乎并不总是有效(我猜该字符串使用的是来自BeautifulSoup的不同编码)。我该如何解决这个问题 无论如何,任何帮助和澄清都将不胜感激 谢谢 编辑: 在阅读BeautifulSo
文件“C:\Python26\lib\encodings\cp437.py”,第12行,编码
返回编解码器.charmap\u encode(输入、错误、编码\u映射)
UnicodeEncodeError:“charmap”编解码器无法将字符u'\u300d'编码到位
3:角色映射到
ANSI不是字符编码(通俗地说,它指的是某些转义序列,尽管它当然是美国国家标准协会的首字母缩略词)。您可以在记事本++中设置编码(并检查您使用的编码)——希望是utf-8,因为这是一种通用编码(用于表示任何Unicode点)。您可以使用显式的解码方法调用从utf-8编码的文本构建Unicode,或者使用编解码器将文件读取为Unicode。打开
(这两种方法都要求您指定编码名称,希望是“utf8”)。ANSI不是字符编码(通俗地说,它指的是某些转义序列,当然它是美国国家标准协会的首字母缩写)。您可以用记事本++设置编码(并检查您使用的编码)——希望是utf-8,因为这是一种通用编码(可以表示任何Unicode点)。您可以使用显式的解码
方法调用从utf-8编码的文本构建unicode,或者使用编解码器将文件读取为unicode。打开
(两者都要求您指定编码名称,希望是“utf8”)
ASCII与所有这些有什么关系
Python无法找出用于存储文本的编码,因此默认情况下采用ascii。然而,ascii仅定义前128个字符,因此任何超出此范围的内容都会导致解码错误(这实际上是一件好事,因为它不允许您使用错误解码的字符串)
大多数情况下,您的字符串都是utf-8格式,因为它是最常见的Unicode编码方式,所以在str
类型字符串上进行s.decode('utf-8')
通常是安全的(或者使用Unicode(s,'utf-8')
调用)
如果您事先不知道编码文本的类型,并且它不提供编码元数据,那么可以尝试使用chardet模块
BeautifulSoup可以以不同的编码和方式输出结果,所以您只需在其中指定希望使用unicode
ASCII与所有这些有什么关系
Python无法找出用于存储文本的编码,因此默认情况下采用ascii。然而,ascii仅定义前128个字符,因此任何超出此范围的内容都会导致解码错误(这实际上是一件好事,因为它不允许您使用错误解码的字符串)
大多数情况下,您的字符串都是utf-8格式,因为它是最常见的Unicode编码方式,所以在str
类型字符串上进行s.decode('utf-8')
通常是安全的(或者使用Unicode(s,'utf-8')
调用)
如果您事先不知道编码文本的类型,并且它不提供编码元数据,那么可以尝试使用chardet模块
BeautifulSoup可以以不同的编码和方式输出结果,因此您只需在其中指定希望使用unicode即可。到目前为止(2014年1月23日),对于记事本++(NPP),关于使用ANSI作为记事本++编码术语,似乎仍有很多最近/未解决的错误报告/讨论
问题
谷歌:记事本++ansi编码
结果:
解决方案
以下NPP论坛讨论似乎为我指出了最佳解决方案
看
首选项->新文档>编码>无BOM的UTF8”调用
应用于打开的ANSI文件
我检查了上面的内容,而不是检查它的作者
然后我开始编写Python脚本,如下所示
#!/usr/bin/python
# -*- coding: utf-8 -*-
截至目前(2014年1月23日),对于记事本++(NPP),似乎仍有许多关于使用ANSI作为记事本++编码术语的最新/未解决的错误报告/讨论
问题
谷歌:记事本++ansi编码
结果:
解决方案
以下NPP论坛讨论似乎为我指出了最佳解决方案
看
首选项->新文档>编码>无BOM的UTF8”调用
应用于打开的ANSI文件
我检查了上面的内容,而不是检查它的作者
然后我开始编写Python脚本,如下所示
#!/usr/bin/python
# -*- coding: utf-8 -*-
我很困惑,因为我在记事本++上看到了“在ANSI中编码”选项。那么从HTML页面上刮下的来自BeautifulSoup的字符串呢?它们可能并不总是utf-8。顺便问一下,Alex,你通常使用什么编辑器?@grokker:“ANSI”实际上有两种含义在文本上下文中。一个是一组用于终端控制的转义序列。在DOS/Windows世界中,还有一个字符集,毫无理由被称为“ANSI”。今天它实际上是Windows-1252(),它几乎是但不完全是ISO拉丁语-1集(尽管它并不总是这样)。这可能就是记事本++所指的。@Nicholas:“ANSI”字符集是cp125x for x在范围(9)内的标准Windows(非DOS)行话,并随区域设置而变化;它不仅仅是cp1252。什么