【问题标题】:python: extended ASCII codespython:扩展的ASCII码
【发布时间】:2014-02-10 19:05:40
【问题描述】:

您好,我想知道如何在 python 中附加然后打印扩展的 ASCII 代码。 我有以下。

code = chr(247)

li = []
li.append(code)
print li

当它应该是一个除法符号时,python 打印出来的结果是 ['\xf7']。如果我直接简单地打印代码“打印代码”,那么我会得到除法符号,但如果我将它附加到列表中则不会。我做错了什么?

谢谢。

【问题讨论】:

  • 扩展 ASCII 定义不明确。有许多。为什么不使用 Unicode?​​span>
  • 没有“扩展 ASCII”这样的东西,有许多不同的编码,其中 247 可以表示不同的东西。您需要使用正确的编码解码字符串。
  • 最常见的扩展名是 Latin-1 的说明非常有帮助。

标签: python ascii python-2.x


【解决方案1】:

没有一个名为“扩展 ASCII 代码”> 的单一定义标准 - 然而,Unicode 标准中定义的字符数量很多,数以万计。

您可以限制文本终端的字符集编码,您可能会认为它是“扩展 ASCII”,但可能是“latin-1”,例如(如果您使用的是 Unix 系统,例如 Linux或 Mac OS X,您的文本终端可能会使用 UTF-8 编码,并且能够显示 Unicode 中可用的数万个字符中的任何一个)

所以,您必须阅读这篇文章以了解 1992 年之后的文本是什么 - 如果你尝试做任何相信“扩展 ASCII”的生产应用程序,你会同时伤害你自己、你的用户和整个生态系统:http://www.joelonsoftware.com/articles/Unicode.html

也就是说,Python2(和 Python3)print 将为传入的对象调用隐式 str 转换。如果使用列表,此转换不会为每个列表元素递归调用 str,而是使用元素的 repr,它将非 ASCII 字符显示为它们的数字表示或其他不合适的符号。

例如,您可以简单地将所需字符加入 unicode 字符串中,然后使用终端编码正常打印它们:

import sys

mytext = u""
mytext += unichr(247) #check the codes for unicode chars here:  http://en.wikipedia.org/wiki/List_of_Unicode_characters

print mytext.encode(sys.stdout.encoding, errors="replace")

【讨论】:

  • 首先是 Ascii 字符 0-127,然后是扩展 Ascii,128-256。然后是字符集中超过 256 个字符的 Unicode。说没有扩展的 Ascii 是不正确的。
  • 这不是“当时有'扩展 ascii'。而是'那时,全世界有数百家供应商,每个供应商都在 128-255 代码空间上推出他们想要的任何东西”。
  • en.wikipedia.org/wiki/Extended_ASCII - "...使用术语“扩展 ASCII”有时会受到批评,[1][2][3] 因为它可能被错误地解释为 ASCII标准已更新为包含超过 128 个字符,或者该术语明确标识了一种编码,但都不是这种情况。”
  • 我建议对开头段落进行修改。当问题确实存在“很多这样的事情”时,声称“没有这样的事情”是不正确的。任何在 80 年代、90 年代甚至 00 年代初的计算机中长大的人都可能知道这个术语,但它可能具有误导性。
【解决方案2】:

您可能需要charmap 编码,它可以让您将unicode 转换为字节而无需“魔法”转换。

s='\xf7'
b=s.encode('charmap')
with open('/dev/stdout','wb') as f:
    f.write(b)
    f.flush()

将在我的系统上打印÷

请注意,“扩展的 ASCII”是指对 ASCII 的许多专有扩展中的任何一个,其中没有一个被正式采用,并且所有这些扩展都相互不兼容。因此,该代码输出的符号将根据控制终端对如何解释它的选择而有所不同。

【讨论】:

    【解决方案3】:

    当您打印一个列表时,它会输出其所有元素的默认表示 - 即通过在每个元素上调用 repr()。根据设计,字符串的repr() 是其转义代码。如果您想正确输出列表的所有元素,您应该将其转换为字符串,例如通过', '.join(li)

    请注意,正如 cmets 中所说的那样,实际上并没有“扩展 ASCII”之类的东西,只有各种不同的编码。

    【讨论】:

    • 如果没有扩展Ascii这种东西,ascii-code.com处的表代表什么?
    • 扩展 Ascii 是超过 128 个字符的过时术语,即代码集范围的上半部分。所以说这不存在有点不准确。这是旧的dos天的东西。如果您使用较新的字符集,现在有多个字符集通常具有 256 个或更多字符。随着时间的推移,人物也发生了变化。因此,如果您查看早期的 ascii 图表和现代的图表,就会发现许多差异。
    • @MTHead 确实,“扩展 ascii”指的是前 128 个字符(任何说“它不存在”的人都会混淆和误导人们)——但更 准确地说,对于前 128 个字符的含义没有单一的标准。 MS-DOS 有超过 200 个代码页,用于对 ASCII 的可能扩展。 ASCII 最流行的扩展是(曾经?)Latin-1,它包含重音字符等以支持几乎所有西欧语言。说“没有扩展 ascii”是错误的,但说“扩展 ascii 就是这样”同样是错误的。
    • @PauldeBarros,如网站所述,该表表示 Windows-1252(或代码页 1252)字符集。这是 ASCII 的超集,这可能就是他们称之为“扩展 ASCII”的原因。恕我直言,这是一个不正确(或至少令人困惑)的术语,因为 ASCII 标准本身没有扩展。相反,有很多基于 ASCII 的新字符集(通过扩展它,从而创建新的唯一字符集)。因此,在那个网站上,您应该将“扩展 ASCII”阅读为“最流行的 ASCII 扩展之一”,这是更准确的描述。
    【解决方案4】:

    你没有做错任何事。

    你所做的就是将长度为 1 的字符串添加到列表中。

    此字符串包含一个超出可打印字符范围和 ASCII(只有 7 位)的字符。这就是为什么它的表示看起来像'\xf7'

    如果你打印它,它会被系统转换得尽可能好。

    在 Python 2 中,字节将被打印出来。结果输出可能是除法符号或任何其他东西,具体取决于您的系统编码。

    在 Python 3 中,它是一个 unicode 字符,将根据 stdout 的设置方式进行处理。通常,这确实应该是除法符号。

    在列表的表示中,字符串的__repr__() 被调用,导致您看到的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-19
      • 1970-01-01
      • 1970-01-01
      • 2011-07-31
      • 1970-01-01
      相关资源
      最近更新 更多