我有一个子过程命令,输出一些字符,例如’\ xf1’。我正在尝试将其解码为utf8,但出现错误。
s = '\xf1'
s.decode('utf-8')
上面抛出:
UnicodeDecodeError: 'utf8' codec can't decode byte 0xf1 in position 0: unexpected end of data
当我使用’latin-1’时它可以工作,但是utf8也不能工作吗?我的理解是latin1是utf8的子集。
我在这里想念什么吗?
编辑:
print s # ñ
repr(s) # returns "'\\xa9'"
您已经将Unicode与UTF-8混淆了。Latin-1是Unicode的子集,但不是UTF-8的子集。 避免像瘟疫一样思考各个代码单元。
只需使用代码点即可。不要考虑UTF-8。考虑一下Unicode。这是您感到困惑的地方。
在Python中使用Unicode非常容易。特别是在Python
3和广泛的版本中,这是我使用Python的唯一方式,但是如果您小心翼翼地坚持使用UTF-8,仍然可以在狭窄的版本中使用旧版Python 2。
为此,请始终将您的源代码编码和输出编码正确地转换为UTF-8。现在,不要再考虑UTF了,而在整个Python程序中仅使用UTF-8文字,逻辑代码点号或符号字符名称。
这是带有行号的源代码:
% cat -n /tmp/py
1 #!/usr/bin/env python3.2
2 # -*- coding: UTF-8 -*-
3
4 from __future__ import unicode_literals
5 from __future__ import print_function
6
7 import sys
8 import os
9 import re
10
11 if not (("PYTHONIOENCODING" in os.environ)
12 and
13 re.search("^utf-?8$", os.environ["PYTHONIOENCODING"], re.I)):
14 sys.stderr.write(sys.argv[0] + ": Please set your PYTHONIOENCODING envariable to utf8\n")
15 sys.exit(1)
16
17 print('1a: el ni\xF1o')
18 print('2a: el nin\u0303o')
19
20 print('1a: el niño')
21 print('2b: el niño')
22
23 print('1c: el ni\N{LATIN SMALL LETTER N WITH TILDE}o')
24 print('2c: el nin\N{COMBINING TILDE}o')
以下是带有非ASCII字符且使用\x{⋯}
符号单引号的打印功能:
% grep -n ^print /tmp/py | uniquote -x
17:print('1a: el ni\xF1o')
18:print('2a: el nin\u0303o')
20:print('1b: el ni\x{F1}o')
21:print('2b: el nin\x{303}o')
23:print('1c: el ni\N{LATIN SMALL LETTER N WITH TILDE}o')
24:print('2c: el nin\N{COMBINING TILDE}o')
这是该程序的示例运行,显示了执行该操作的三种不同方式(a,b和c):第一种设置为源代码中的文字(将受StackOverflow的NFC转换约束,因此不可信任!!)
!)和后两个集合分别具有 数字Unicode代码点 和 符号Unicode字符名称
,它们再次被单引号括起来,因此您可以看到真正的含义:
% python /tmp/py
1a: el niño
2a: el niño
1b: el niño
2b: el niño
1c: el niño
2c: el niño
% python /tmp/py | uniquote -x
1a: el ni\x{F1}o
2a: el nin\x{303}o
1b: el ni\x{F1}o
2b: el nin\x{303}o
1c: el ni\x{F1}o
2c: el nin\x{303}o
% python /tmp/py | uniquote -v
1a: el ni\N{LATIN SMALL LETTER N WITH TILDE}o
2a: el nin\N{COMBINING TILDE}o
1b: el ni\N{LATIN SMALL LETTER N WITH TILDE}o
2b: el nin\N{COMBINING TILDE}o
1c: el ni\N{LATIN SMALL LETTER N WITH TILDE}o
2c: el nin\N{COMBINING TILDE}o
我真的不喜欢二进制html" target="_blank">文件,但这是二进制字节的样子:
% python /tmp/py | uniquote -b
1a: el ni\xC3\xB1o
2a: el nin\xCC\x83o
1b: el ni\xC3\xB1o
2b: el nin\xCC\x83o
1c: el ni\xC3\xB1o
2c: el nin\xCC\x83o
即使使用UTF-8源码,也应该仅考虑和使用逻辑Unicode代码点编号(或符号命名字符),而不要使用作为UTF-8串行表示基础的单个8位代码单元(或就此而言)
UTF-16)。很少需要代码单位而不是代码点,这只会使您感到困惑。
如果使用广泛的Python3版本,您将获得比其他选择更可靠的行为,但这是UTF-32问题,而不是UTF-8问题。如果您顺其自然,那么UTF-32和UTF-8都易于使用。
问题内容: 考虑以下: 我一直在寻找背后的逻辑,但是没有运气。值得一提的是,如果将结构更改为类,则效果很好。 总是可以添加一种解决方法,并将fooArray的每个对象映射为强制类型,将它们转换为Any类型,但这不是这里的问题。我正在寻找一种解释,为什么会这样。 有人可以解释一下吗? 问题答案: Swift 3更新 从Swift 3(特别是Xcode 8 beta 6附带的内部版本)开始,集合类型现
问题内容: 我想知道为什么你不能做: 我发现这将需要运行时在片上执行循环以转换每个元素,这将是非惯用的Go。这很有道理。 然而,这可能不会被刚刚走样编译器解决的,所以在内部它们是相同的,他们使用相同类型的头底下?我猜答案虽然不是我好奇为什么。 问题答案: 这个: 是类型转换。根据规范,转换具有特定的规则: 在以下任何一种情况下,可以将非恒定值转换为类型: 是分配给。 的类型,并且具有相同的基础类型
问题内容: 我经常使用此代码将视图居中: 它在Firefox,Internet Explorer和Chrome上运行良好,但在Safari上却无法运行。 在Safari Web浏览器中将图像居中的解决方法是什么? 问题答案: 您需要另一个供应商前缀样式。
问题内容: 我可以隐式地将int转换为long,并将long转换为Long。为什么无法将int隐式转换为Long?为什么Java不能在示例的最后一行进行隐式转换? 问题答案: 和是对象。装箱/拆箱仅适用于原语。做的就像,那不是不!另外,请记住,之间没有继承,所以甚至无效
问题内容: 为什么写: 问题答案: 实现的对象是。 您要在其中覆盖的方法应将对象作为参数,而将其强制转换为。您的实现应描述如何与另一个进行比较。 要真正进行排序,您可能还需要制作工具,然后将实际逻辑复制粘贴到其中。
问题内容: 我当前正在使用条件来检索用户的详细信息,但是当尝试用合适的用户查询详细信息对象时,我得到了ClassCastException。 我的标准代码; 我也尝试使用; 两者都给我ClassCastException。我知道我可以通过让用户实现Serializable来轻松解决它,但是还有其他解决方案吗? 问题答案: 唯一的其他解决方案是实现Externalizable。