gpt4 book ai didi

string - Python 对 shell 字符串的处理

转载 作者:行者123 更新时间:2023-12-04 22:59:07 27 4
gpt4 key购买 nike

我仍然不完全理解 python 的 unicode 和 str 类型是如何工作的。注意:我正在使用 Python 2,据我所知,Python 3 对同一问题有完全不同的方法。

我所知道的 :
str是一种较旧的野兽,它保存由历史迫使我们使用的太多编码方式之一编码的字符串。
unicode是使用包含所有可能字符、表情符号、狗屎小图片等的巨大表格来表示字符串的更标准化方式。
decode函数将字符串转换为 unicode,encode反过来。

如果我在 python 的 shell 中,只需说:

>>> my_string = "some string"

然后 my_stringstrascii 中编码的变量(并且,因为 ascii 是 utf-8 的子集,它也被编码在 utf-8 中)。

因此,例如,我可以将其转换为 unicode通过说其中一行来变量:
>>> my_string.decode('ascii')
u'some string'
>>> my_string.decode('utf-8')
u'some string'

我所不知道的 :

Python 是如何处理shell 中传递的非ascii 字符串的,知道了这一点,保存单词 "kožušček" 的正确方法是什么? ?

例如,我可以说
>>> s1 = 'kožušček'

在这种情况下 s1变成 str我无法转换为 unicode 的实例:
>>> s1='kožušček'
>>> s1
'ko\x9eu\x9a\xe8ek'
>>> print s1
kožušček
>>> s1.decode('ascii')

Traceback (most recent call last):
File "<pyshell#23>", line 1, in <module>
s1.decode('ascii')
UnicodeDecodeError: 'ascii' codec can't decode byte 0x9e in position 2: ordinal not in range(128)

现在,我自然无法用 ascii 解码字符串。 ,但是我应该使用什么编码?毕竟我的 sys.getdefaultencoding()返回 ascii ! Python 使用哪种编码来编码 s1当馈线时 s1=kožušček ?

我的另一个想法是说
>>> s2 = u'kožušček'

但是,当我打印 s2 时, 我有
>>> print s2
kouèek

这意味着 Python 丢失了一个完整的字母。谁可以给我解释一下这个?

最佳答案

str对象包含字节。这些字节代表什么 Python 并没有规定。如果您生成了与 ASCII 兼容的字节,则可以将它们解码为 ASCII。如果它们包含表示 UTF-8 数据的字节,它们可以被解码。如果它们包含表示图像的字节,那么您可以解码该信息并在某处显示图像。当您使用 repr()str object Python 将保留任何可 ASCII 打印的字节,其余的将转换为转义序列;即使在仅 ASCII 的环境中,这也使调试此类信息变得实用。

运行交互式解释器的终端或控制台将字节写入 stdin键入时 Python 从中读取的流。这些字节根据该终端或控制台的配置进行编码。

在您的情况下,您的控制台很可能将您键入的输入编码为 Windows 代码页。您需要找出确切的代码页并使用该编解码器来解码字节。代码页 1252 似乎适合:

>>> print 'ko\x9eu\x9a\xe8ek'.decode('cp1252')
kožušèek

当您打印这些相同的字节时,您的控制台正在读取这些字节并在它已经配置的相同编解码器中解释它们。

Python 可以告诉你它认为你的控制台设置了什么编解码器;它尝试为 Unicode 文字检测此信息,其中必须为您解码输入。它使用 locale.getpreferredencoding() function确定这一点,以及 sys.stdinsys.stdout对象有一个 encoding属性;我的设置为UTF-8:
>>> import sys
>>> sys.stdin.encoding
'UTF-8'
>>> import locale
>>> locale.getpreferredencoding()
'UTF-8'
>>> 'kožušèek'
'ko\xc5\xbeu\xc5\xa1\xc3\xa8ek'
>>> u'kožušèek'
u'ko\u017eu\u0161\xe8ek'
>>> print u'kožušèek'
kožušèek

因为我的终端已配置为 UTF-8 并且 Python 已检测到这一点,使用 Unicode 文字 u'...'作品。数据由 Python 自动解码。

我不知道为什么你的控制台丢失了一整封信;我必须访问您的控制台并进行更多实验,请参阅 print repr(s2) 的输出,并测试 0x00 和 0xFF 之间的所有字节,看看这是在控制台的输入端还是输出端。

我建议你阅读 Python 和 Unicode:
  • Pragmatic Unicode作者:内德·巴切尔德
  • The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)作者:乔尔·斯波尔斯基
  • Python Unicode HOWTO
  • 关于string - Python 对 shell 字符串的处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31717911/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com