Python 对unicode字符串调用str()时会发生什么?

Python 对unicode字符串调用str()时会发生什么?,python,python-2.7,unicode,Python,Python 2.7,Unicode,我想知道在unicode字符串上调用str()时内部会发生什么 # coding: utf-8 s2 = str(u'hello') s2只是str()arg的unicode字节表示形式吗?它将尝试使用默认编码对其进行编码。在我的系统上,这是ASCII,如果有任何非ASCII字符,它将失败: >>> str(u'あ') UnicodeEncodeError: 'ascii' codec can't encode character u'\u3042' in position

我想知道在unicode字符串上调用str()时内部会发生什么

# coding: utf-8
s2 = str(u'hello')

s2只是str()arg的unicode字节表示形式吗?

它将尝试使用默认编码对其进行编码。在我的系统上,这是ASCII,如果有任何非ASCII字符,它将失败:

>>> str(u'あ')
UnicodeEncodeError: 'ascii' codec can't encode character u'\u3042' in position 0: ordinal not in range(128)
请注意,如果对其调用
encode('ascii')
,则会出现相同的错误:

>>> u'あ'.encode('ascii')
UnicodeEncodeError: 'ascii' codec can't encode character u'\u3042' in position 0: ordinal not in range(128)

正如您所想象的,
str
处理某些参数而在其他参数上失败,这使得编写乍一看似乎有效的代码变得很容易,但一旦您在其中添加了一些国际字符,代码就会停止工作。Python3通过使问题显而易见来避免这种情况:如果没有显式编码,就无法将Unicode转换为字节字符串:

>>> bytes(u'あ')
TypeError: string argument without an encoding

它将尝试使用默认编码对其进行编码。在我的系统上,这是ASCII,如果有任何非ASCII字符,它将失败:

>>> str(u'あ')
UnicodeEncodeError: 'ascii' codec can't encode character u'\u3042' in position 0: ordinal not in range(128)
请注意,如果对其调用
encode('ascii')
,则会出现相同的错误:

>>> u'あ'.encode('ascii')
UnicodeEncodeError: 'ascii' codec can't encode character u'\u3042' in position 0: ordinal not in range(128)

正如您所想象的,
str
处理某些参数而在其他参数上失败,这使得编写乍一看似乎有效的代码变得很容易,但一旦您在其中添加了一些国际字符,代码就会停止工作。Python3通过使问题显而易见来避免这种情况:如果没有显式编码,就无法将Unicode转换为字节字符串:

>>> bytes(u'あ')
TypeError: string argument without an encoding

哎呀,我错过了“内部”这个词+1:)这是有道理的。我没有意识到str()受到系统默认编码的影响。我的是utf-8,这意味着它一直对我有效。哎呀,我错过了“内部”这个词+1:)这是有道理的。我没有意识到str()受到系统默认编码的影响。我的是utf-8,这意味着它一直对我有效。我不想太苛刻,但是。。。你试试看怎么样?当你尝试它时,它看起来像Unicode字节吗?我问了更多关于Unicode的内部表示,以及在不同的用例(尽管是错误的用例)下它是如何翻译的。这个例子只是一个简单的例子,只是为了说明用例。我认为这样做的结果是相当明显的,特别是因为utf-8与ascii兼容。我不明白你的评论到底有什么补充,虽然我本可以把问题说得更清楚。我不想太苛刻,但是。。。你试试看怎么样?当你尝试它时,它看起来像Unicode字节吗?我问了更多关于Unicode的内部表示,以及在不同的用例(尽管是错误的用例)下它是如何翻译的。这个例子只是一个简单的例子,只是为了说明用例。我认为这样做的结果是相当明显的,特别是因为utf-8与ascii兼容。我看不出你的评论到底有什么补充,尽管我本可以把问题说得更清楚。