【发布时间】:2011-01-28 17:28:19
【问题描述】:
喜欢:
u'Hello'
我的猜测是它表示“Unicode”,对吗?
如果有,从什么时候开始提供?
【问题讨论】:
喜欢:
u'Hello'
我的猜测是它表示“Unicode”,对吗?
如果有,从什么时候开始提供?
【问题讨论】:
我来到这里是因为我的requests 输出出现了funny-char-syndrome。我以为response.text 会给我一个正确解码的字符串,但在输出中我发现了有趣的双字符,而德国元音变音应该是。
原来response.encoding 不知何故为空,所以response 不知道如何正确解码内容,只是将其视为 ASCII(我猜)。
我的解决方案是使用“response.content”获取原始字节并手动将decode('utf_8') 应用于它。结果是 schöne Umlaute。
正确解码
für
对比解码不当
fĂźr
【讨论】:
你是对的,见3.1.3. Unicode Strings。
这是自 Python 2.0 以来的语法。
Python 3 使它们变得多余,因为默认的字符串类型是 Unicode。 3.0 到 3.2 版本删除了它们,但它们是 re-added in 3.3+ 以与 Python 2 兼容以帮助 2 到 3 的转换。
【讨论】:
ur"string")在 Python 2 中是有效的,但不幸的是它在 Python 3 中是无效的语法。
我的猜测是它表示“Unicode”,对吗?
是的。
如果有,从什么时候开始?
Python 2.x.
在 Python 3.x 中,字符串默认使用 Unicode,并且不需要 u 前缀。 注意: 在 Python 3.0-3.2 中,u 是语法错误。在 Python 3.3+ 中,让编写 2/3 兼容的应用程序变得更容易再次是合法的。
【讨论】:
u 前缀甚至是一个语法错误。
six.text_type() 来处理仍在使用 3 的(希望是微乎其微的)人数。[012] - 至少信息在那里,所以你可以选择。
这是 Unicode。
只需将变量放在str() 之间即可。
但如果您有两个如下列表:
a = ['co32','co36']
b = [u'co32',u'co36']
如果你检查set(a)==set(b),它将是False,但如果你这样做:
b = str(b)
set(a)==set(b)
现在,结果将是 True。
【讨论】:
str() 或 u'€'.encode())进行编码。如果字符串包含非 ASCII,用户将收到 UnicodeEncodeException。
b = str(b) 只是给出列表的字符串repr(),即b = "[u'co32', u'co36']"。然后set(a)==set(b) = False
u'Some String' 中的 u 表示你的字符串是一个 Unicode 字符串。
问:我非常着急,从 Google 搜索来到这里。我正在尝试将此数据写入文件,但出现错误,此时我需要最简单但可能有缺陷的解决方案。
A:你真的应该阅读 Joel 的 Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) 关于字符集的文章。
问:请不要有时间码
答:好的。试试str('Some String') 或'Some String'.encode('ascii', 'ignore')。但是您真的应该阅读一些关于Converting a Unicode string 和this 的答案和讨论,非常好,非常好,字符编码入门。
【讨论】:
所有用于人类的字符串都应使用 u""。
我发现以下思维方式在处理 Python 字符串时有很大帮助:所有 Python 清单字符串应使用 u"" 语法。 "" 语法仅适用于字节数组。
在抨击开始之前,让我解释一下。大多数 Python 程序都是从使用 "" 开始的。但是随后他们需要支持 Internet 上的文档,因此他们开始使用 "".decode 并且突然之间,他们到处都在解码这个和那个 - 这一切都是因为使用 "" 来处理字符串。在这种情况下,Unicode 确实像病毒一样,会造成严重破坏。
但是,如果你遵循我的规则,你就不会感染这种病毒(因为你已经被感染了)。
【讨论】:
bash -c "echo Shouldn\\'t you use b\\\"...\\\" for byte arrays?"
u""。