【问题标题】:ANSI, ASCII, Unicode and encoding confusion with PythonANSI、ASCII、Unicode 和编码与 Python 的混淆
【发布时间】:2011-03-20 10:29:06
【问题描述】:

我很高兴使用 BeautifulSoup,我还使用文本文件作为 Python 脚本的输入参数。

然后我遇到了著名的“UnicodeEncodeError”错误。

我一直在 SO 阅读问题,但我仍然感到困惑。

ASCII 与所有这些有什么关系? 我在文本编辑器 (Notepad++) 上使用什么编码? ANSI? UTF-8? 将字符串解码为 ASCII 似乎并不总是有效(我猜字符串是来自 BeautifulSoup 的不同编码)。我该如何解决这个问题?

无论如何,我们将不胜感激任何帮助和澄清。

谢谢!

编辑: 阅读 BeautifulSoup 的文档,它说它只使用 unicode,但我仍然遇到 Unicode 错误:(

  File "C:\Python26\lib\encodings\cp437.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode character u'\u300d' in position
 3: character maps to <undefined>

【问题讨论】:

    标签: python unicode beautifulsoup


    【解决方案1】:

    截至目前(2014 年 1 月 23 日),对于 Notepad++ (NPP),似乎仍有很多关于使用 ANSI 作为 Notepad++ 编码术语的近期/未解决的错误报告/讨论。

    问题

    谷歌:notepad++ ansi 编码

    结果:

    #4095 "ANSI as UTF-8" Misleading

    #124 ansi encoding and german letters

    The encoding that Notepad++ just calls “ANSI”, does anyone know what to call it for Ruby?

    Notepad++ Forum - Search discussion: ANSI encoding

    解决方案

    以下 NPP 论坛讨论似乎为我指出了最佳解决方案。

    Encoding detection, ANSI (Windows 1252) vs. UTF-8 (w/o BOM)

    Preferences -> New Document > Encoding > UTF8 without BOM”调用 应用于打开的 ANSI 文件

    我将以上内容勾选为与取消勾选的作者相反。

    然后我开始我的 Python 脚本如下。

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    

    【讨论】:

      【解决方案2】:

      ASCII 与所有这些有什么关系?

      Python 无法找出用于存储文本的编码,因此它默认采用 ascii。但是,ASCII 只定义了前 128 个字符,因此任何外部的内容都会导致解码错误(这实际上是一件好事,因为它不会让您使用错误解码的字符串)。

      大多数情况下,您的字符串将采用 utf-8 格式,因为它是编码 Unicode 的最常见方式,因此它通常可以安全地在 str 类型字符串上执行 s.decode('utf-8')(或使用unicode(s, 'utf-8')打电话)

      如果你事先不知道文本有什么样的编码,并且它没有提供编码元数据,你可以尝试使用 chardet 模块。

      BeautifulSoup 可以以不同的编码和方式输出结果,因此您只需在此处指定要使用 unicode 即可。

      【讨论】:

        【解决方案3】:

        ANSI 不是字符编码(通常说它是指某些转义序列,尽管它当然是美国国家标准协会的首字母缩写词)。您可以在 Notepad++ 中设置编码(并检查您使用的编码)——希望是 utf-8,因为这是一种通用编码(让您代表任何 Unicode 点)。您可以使用显式的 decode 方法调用从 utf-8 编码文本构建 unicode,或者使用 codecs.open 将文件读取为 unicode(两者都要求您指定编码名称 - 再次,希望是 'utf8')。

        【讨论】:

        • 我很困惑,因为我在 Notepad++ 中看到了“在 ANSI 中编码”选项,那么来自 HTML 页面的 BeautifulSoup 的字符串呢?它们可能并不总是 utf-8。顺便说一句,Alex,你通常使用什么编辑器?
        • @grokker:在文本上下文中,“ANSI”实际上有两种含义。一个是一组用于终端控制的转义序列。在 DOS/Windows 世界中,还有一个字符集,无论如何,它被称为“ANSI”。今天它实际上是 Windows-1252 (en.wikipedia.org/wiki/Windows-1252),它几乎是 ISO Latin-1 集(尽管并非总是如此)。这可能就是 Notepad++ 所指的。
        • @Nicholas:“ANSI”字符集是 cp125x for x in range(9) 的标准 Windows(非 DOS)行话,并随语言环境而异;不仅仅是cp1252。 “虽然并非一直如此”是什么意思?
        • @grokker,我几乎总是使用 vim(自从我在 70 年代学习 vi 以来,我的手指的“肌肉记忆”已经消除了人体工程学专家对其模态性质的所有恐怖呼喊;-),通常在 gvim GUI 版本中(真正的 vi 纯粹主义者总是在终端中使用 vim;-)。人们要么喜欢(我们中的一些人)要么讨厌(更多的人)vi...!-)
        • 谢谢亚历克斯。实际上,我会尽可能地使用 vim,尤其是在通过 ssh 编辑文件时。虽然我发现 IDE 对大多数用途都非常方便,但 vim 总是有一个特殊的地方:)
        猜你喜欢
        • 2010-09-06
        • 1970-01-01
        • 2023-03-18
        • 2013-11-19
        • 1970-01-01
        • 1970-01-01
        • 2017-12-05
        • 1970-01-01
        • 2018-02-24
        相关资源
        最近更新 更多