Python 如何防止str将unicode字符编码为十六进制代码?
当我直接在Python中打印一个unicode字符串时,我看到一个字符串具有与我的字符串中相同的字符。当我将其嵌入某个容器(放入列表、地图等)时,Python 如何防止str将unicode字符编码为十六进制代码?,python,unicode,encoding,Python,Unicode,Encoding,当我直接在Python中打印一个unicode字符串时,我看到一个字符串具有与我的字符串中相同的字符。当我将其嵌入某个容器(放入列表、地图等)时,strrepresentation将unicode字符转换为\uxxx表示。 有趣的是,我可以用一个字符串在这个容器上调用print,但不能print str字符串本身(给出一个UnicodeEncodeError) 我可以将str配置为将嵌套字符串编码为UTF8字符串吗?查看这个十六进制符号会让调试非常痛苦 例如: >>> v =
str
representation将unicode字符转换为\uxxx表示。
有趣的是,我可以用一个字符串在这个容器上调用print
,但不能print str
字符串本身(给出一个UnicodeEncodeError)
我可以将str
配置为将嵌套字符串编码为UTF8字符串吗?查看这个十六进制符号会让调试非常痛苦
例如:
>>> v = u"abc123абв"
>>> d = [v]
>>> print v
abc123абв
>>> print d
[u'abc123\u0430\u0431\u0432']
>>> print str(v)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec cant encode characters in position 6-8: ordinal not in range(128)
>>> print str(d)
[u'abc123\u0430\u0431\u0432']
不要改变你的思维方式 若您需要打印netsted元素,而不是从容器中获取并打印它,那个么不要打印所有容器
v = u"abc123абв"
d = [v, v, v]
print d[0]
# abc123абв
print ", ".join(d)
# abc123абв, abc123абв, abc123абв
顺便说一句:Python打印十六进制代码(和其他元素)用于测试/调试 当你看到
[u'abc123\u0430\u0431\u0432']
您知道:它是一个带有unicode文本(
u
和'
)的列表([
和]
),文本中有非ASCII字符 不要改变str
,改变你的思维方式
若您需要打印netsted元素,而不是从容器中获取并打印它,那个么不要打印所有容器
v = u"abc123абв"
d = [v, v, v]
print d[0]
# abc123абв
print ", ".join(d)
# abc123абв, abc123абв, abc123абв
顺便说一句:Python打印十六进制代码(和其他元素)用于测试/调试
当你看到
[u'abc123\u0430\u0431\u0432']
您知道:它是一个带有unicode文本(u
和'
)的列表([
和]
),文本中有非ASCII字符 print[v]
调用repr(v)
,按原样返回ascii可打印字符,并使用\x
,\u
,\u
记住像dict(a=1)
这样的对象与其文本表示形式(repr(dict(a=1))
不同。Unicode字符串也是一个对象(type(v)=Unicode
)和其他任何字符串一样,因此repr(v)不是v
(顺便说一句,repr(repr(v))也不是repr(v)
,仔细想想)
要在Python控制台中显示人类可读的文本以进行调试,您可以提供自定义的sys.displayhook
,例如,您可以使用sys.stdout.encoding
对任何(嵌入的)unicode
对象进行编码。在Python3中,repr(unicode\u string)
返回当前环境中可按原样打印的unicode字符(会导致UnicodeEncodeError
的字符被转义)
str(v)
提升unicodeincoder错误
是不相关的str(v)
调用v.encode(sys.getdefaultencoding())
,因此对于任何带有非ascii字符的unicode字符串,它都会失败。不要在Unicode字符串上调用str()
(这几乎总是一个错误),而是直接打印Unicode。print[v]
调用repr(v)
,按原样返回ascii可打印字符,并使用\x
,\u
,\u
记住像dict(a=1)
这样的对象与其文本表示形式(repr(dict(a=1))
不同。Unicode字符串也是一个对象(type(v)=Unicode
)和其他任何字符串一样,因此repr(v)不是v
(顺便说一句,repr(repr(v))也不是repr(v)
,仔细想想)
要在Python控制台中显示人类可读的文本以进行调试,您可以提供自定义的sys.displayhook
,例如,您可以使用sys.stdout.encoding
对任何(嵌入的)unicode
对象进行编码。在Python3中,repr(unicode\u string)
返回当前环境中可按原样打印的unicode字符(会导致UnicodeEncodeError
的字符被转义)
str(v)
提升unicodeincoder错误
是不相关的str(v)
调用v.encode(sys.getdefaultencoding())
,因此对于任何带有非ascii字符的unicode字符串,它都会失败。不要在Unicode字符串上调用str()
(这几乎总是一个错误),而是直接打印Unicode。感谢您提供的信息性答案。我根本没有意识到repr
用于打印容器。所以你基本上说我不能在Python2中将print d
中的转义字符更改为Unicode(而Python3将自动执行),是吗?@Osman pasha正如我所说,如果你想更改Python控制台中显示的内容:>>d
,那么设置sys.displayhook
。使用d
而不是print d
如果它不是交互式的,那么您可以随意打印列表,例如print json.dumps(d,确保ascii=False)
谢谢您提供的信息性答案。我根本没有意识到repr
用于打印容器。所以你基本上说我不能在Python2中将print d
中的转义字符更改为Unicode(而Python3将自动执行),是吗?@Osman pasha正如我所说,如果你想更改Python控制台中显示的内容:>>d
,那么设置sys.displayhook
。使用d
而不是print d
如果它不是交互式的,那么您可以随意打印列表,例如print json.dumps(d,确保ascii=False)