Python 如何防止str将unicode字符编码为十六进制代码?

Python 如何防止str将unicode字符编码为十六进制代码?,python,unicode,encoding,Python,Unicode,Encoding,当我直接在Python中打印一个unicode字符串时,我看到一个字符串具有与我的字符串中相同的字符。当我将其嵌入某个容器(放入列表、地图等)时,strrepresentation将unicode字符转换为\uxxx表示。 有趣的是,我可以用一个字符串在这个容器上调用print,但不能print str字符串本身(给出一个UnicodeEncodeError) 我可以将str配置为将嵌套字符串编码为UTF8字符串吗?查看这个十六进制符号会让调试非常痛苦 例如: >>> v =

当我直接在Python中打印一个unicode字符串时,我看到一个字符串具有与我的字符串中相同的字符。当我将其嵌入某个容器(放入列表、地图等)时,
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)