Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对十六进制和utf-8编码感到困惑_Python_Utf 8_Character Encoding - Fatal编程技术网

Python 对十六进制和utf-8编码感到困惑

Python 对十六进制和utf-8编码感到困惑,python,utf-8,character-encoding,Python,Utf 8,Character Encoding,让我们来看看角色ñ() 当我运行ord('ñ')时,我返回241——即它是第241个编码字符。 当我运行hex(ord('ñ'))时,我返回0xf1,这是241的十六进制值 那么,为什么当我运行“ñ”.encode('utf-8')时,我会返回b'\xc3\xb1'或50097?我们刚才不是确认了ñ是f1(十六进制)还是241(十二进制)?241是unicode码点,对应于字形“拉丁文小写字母N加波浪号”。在Python中,字符作为unicode码点存储在内部,因此ord('ñ')是241 编码

让我们来看看角色ñ()

当我运行
ord('ñ')
时,我返回
241
——即它是第241个编码字符。
当我运行
hex(ord('ñ'))
时,我返回
0xf1
,这是
241
的十六进制值


那么,为什么当我运行
“ñ”.encode('utf-8')
时,我会返回
b'\xc3\xb1'
50097
?我们刚才不是确认了
ñ
f1
(十六进制)还是
241
(十二进制)?

241是unicode码点,对应于字形“拉丁文小写字母N加波浪号”。在Python中,字符作为unicode码点存储在内部,因此
ord('ñ')
是241

编码是字符到字节的映射。不同的编码可能使用也可能不使用相同的字节来表示相同的字符

>>> 'ñ'.encode('utf-8')
b'\xc3\xb1'
>>> 'ñ'.encode('latin-1')
b'\xf1'
>>> 'ñ'.encode('cp1252')
b'\xf1'
>>> 'ñ'.encode('cp1254')
b'\xf1'
>>> 'ñ'.encode('utf-16')
b'\xff\xfe\xf1\x00'
>>> 'ñ'.encode('utf-32')
b'\xff\xfe\x00\x00\xf1\x00\x00\x00'
如果在不提供目标编码的情况下调用
str.encode()
,Python将在本例中选择系统默认值-UTF-8

总而言之:

  • ord
    返回特定字符的unicode码点
  • s.encode(“”)
    返回所提供编码中映射到该字符的字节

TL;DR:UTF-8并不是简单地将Unicode码点值直接编码为字节,它比这稍微复杂一些。