为什么在将其转换为Unicode后仍然看起来像字节?

时间:2015-03-11 22:34:30

标签: python unicode

我的所有内容都在我的代码中运行,但我仍然很好奇。我有一个字符串:“stación。”当我将该字符串转换为unicode时,我得到:

unicode('stación', 'utf-8')
>>> u'staci\xf3n'

那里的“\ xf3”看起来像一个字节字符。这与以下不同:

unicode('Поиск', 'utf-8')
>>> u'\u041f\u043e\u0438\u0441\u043a'

在后一个示例中,与之前转换为unicode的所有内容一样,我得到以“\ u”开头的unicode字符。通常,当我看到以“\ x”开头的字节时,我认为存在问题。什么给这里?这是因为“ó”是扩展的ASCII吗?

2 个答案:

答案 0 :(得分:2)

不,这是因为“ó”是前255个字符内的非ASCII字符。由于它可以使用单个字节表示,因此我们在表示中保存了2个字符。其他两个表示是有效的,但不是必需的。

>>> u'\u00f3'
u'\xf3'
>>> u'\U000000f3'
u'\xf3'

答案 1 :(得分:0)

u'\xf3'不是一个字节;它是一个带有单个Unicode代码点(U+00f3 LATIN SMALL LETTER O WITH ACUTE)的Unicode字符串。

你看到的是什么(u'\xf3'),Python 2选择用0..255范围内的Unicode序号(整数)表示Unicode字符,这些字符不是可打印的ascii字符(Python 3会显示{{1}在这里,默认情况下,只有不可打印的字符使用'ó'形式。由于@Ignacio Vazquez-Abrams said'\xhh'u'\u00f3'文字会创建完全相同的Unicode字符串。

你可以看到Unicode字符(u'\U000000f3')在不同的字符编码中看起来像字节的比较:

u'\xf3'

注意:>>> print(u'\xf3') ó >>> u'\xf3'.encode('utf-8') b'\xc3\xb3' >>> u'\xf3'.encode('utf-16be') b'\x00\xf3' >>> u'\xf3'.encode('utf-32le') b'\xf3\x00\x00\x00' >>> u'\xf3'.encode('cp1252') b'\xf3' b'\xf3'是不同的事情。前者是包含单个字节(整数u'\xf3')的字节字符串,后者是包含单个Unicode代码点的Unicode字符串(Unicode序数243)。数量是相同的243单位是不同的 - 100卡路里与100克不同。