【问题标题】:Should StringIO(HighSurrogate) throw an error in Python 2.7?StringIO(HighSurrogate) 是否应该在 Python 2.7 中引发错误?
【发布时间】:2019-08-24 18:11:58
【问题描述】:

当我运行这个 Python 2.7 代码时(编辑:更新了代码

import io
x = io.StringIO(u'\ud801')

CPython 运行良好,但 IronPython 抛出以下错误:

UnicodeEncodeError:
Unable to translate Unicode character \uD801 at index 0 to specified code page.

我猜这是因为U+D801 is an unpaired surrogate and thus an invalid character,但是哪个实现在这里显示了正确的行为?这段代码应该抛出还是不抛出?

【问题讨论】:

    标签: python python-2.7 unicode encoding surrogate-pairs


    【解决方案1】:

    它们都是正确的,但不是在做同样的事情。 IronPython 似乎正在尝试print Unicode 字符,但未能将其转换为当前代码页。如果你打印字符,你会得到与 Python 2.7 相同的行为:

    >>> import io
    >>> io.StringIO(u'\ud801').getvalue()
    u'\ud801'
    >>> print(io.StringIO(u'\ud801').getvalue())
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "C:\Python27\lib\encodings\cp437.py", line 12, in encode
        return codecs.charmap_encode(input,errors,encoding_map)
    UnicodeEncodeError: 'charmap' codec can't encode character u'\ud801' in position 0: character maps to <undefined>
    

    【讨论】:

    • 很遗憾,这是不正确的。甚至 io.StringIO(u'\ud801') and None 在 IronPython 中也会出错。好像和打印没什么关系。
    • io.StringIO(u'\ud801').getvalue().encode('unicode-escape') 将是另一种安全测试的方式。但似乎错误在于字符串文字的创建。
    • @mehrdad 是正确的。 Iron Python 正在尝试打印实际的 Unicode 字符并失败。这不是 Python 2.7 正在做的事情。它只是显示转义码的 ASCII 表示,并且没有无效字符被编码到终端。您收到 UnicodeEncodeError 的事实表明 IronPython 正在做一些不同的事情。您使用的是什么 IDE,是 IronPython 2.7 还是其他?
    • @MarkTolonen:不,这绝对与打印无关。 i.stack.imgur.com/C730F.png
    • print 是一个错误的选择,但 PNG 清楚地表明了这一点。 encode 会是更好的词选择。 Python 2.7 是正确的。看起来 IronPython 正在尝试在内部将 Unicode 字符串转换为字节字符串,但没有理由这样做。打印执行相同的转换,这就是导致相同错误的原因。编辑您的问题并粘贴您的 PNG 示例的文本。它更好地解释了您所看到的行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 2017-10-04
    • 2014-04-14
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    相关资源
    最近更新 更多