【问题标题】:Python 2.7 Non-ASCII character inside byte string字节字符串中的 Python 2.7 非 ASCII 字符
【发布时间】:2017-02-22 17:44:02
【问题描述】:

我知道 Python 2.7 字节字符串只接受 ASCII 字符,我想知道为什么以下工作?看起来 ü 是用其他格式编码的,你能解释一下吗?

>>> s = "Flügel"
>>> s
'Fl\x81gel'

【问题讨论】:

  • 不,Python 字节字符串采用 0-255 范围内的 任何字节(十六进制 0x00 到 0xFF),而不仅仅是 0-127 的 ASCII 范围(0x00-0x7F )。
  • Python 2.7 字节字符串采用字节序列——不仅仅是 ASCII 字符。字节可以具有来自0x00 -> 0xff 的任意值。
  • 当你输入ü时,你的终端会发送字节0x81,所以这就是存储的内容。
  • 如果我在命令行中将其粘贴到 2.7.13 中,我会得到一个带有 Fl\xc3\xbcgelstr,所以 Python 或我的终端正在转储为 Unicode?那是 ASCII 码?
  • @NickT;您的终端配置为使用 UTF-8 进行通信,OP 使用的是拉丁语变体(可能是 CP1252 之类的 Windows 代码页)。不要将编码与 Unicode 混淆; UTF-8 是一种可以编码所有 Unicode 标准的编解码器,但 UTF-16 和 UTF-32 也可以。

标签: python string python-2.7 ascii


【解决方案1】:

我知道 Python 2.7 字节字符串只接受 ASCII 字符,

你误会了。 Python 字节字符串采用任何有效字节。字节基本上是 0 到 255 范围内的整数值(ASCII 涵盖 0 到 127)。

当您在终端或控制台中打开交互式解释器提示时,该终端或控制台的配置决定了您可以键入哪些字节并将其发送到 Python。您似乎正在使用发送拉丁文本的文本(number of variants 发送 0x81 表示 ü)。 Python 将其存储在字节串中。

您可以通过查看sys.stdin.encoding 来检查所使用的编解码器。

我的配置为处理 UTF-8,它使用 两个 字节来编码相同的字符 (U+00FC LATIN SMALL LETTER U WITH DIAERESIS):

>>> import sys
>>> sys.stdin.encoding
'UTF-8'
>>> s = 'Flügel'
>>> s
'Fl\xc3\xbcgel'

【讨论】:

    猜你喜欢
    • 2017-04-13
    • 2023-04-07
    • 1970-01-01
    • 2019-10-15
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    相关资源
    最近更新 更多