在Python中将utf-8转换为拉丁语-1

在Python中将utf-8转换为拉丁语-1,python,unicode,encoding,utf-8,latin1,Python,Unicode,Encoding,Utf 8,Latin1,我想这样做: 取此utf-8字符串的字节: 访视频 用拉丁语1对这些字节进行编码并打印结果: èè视è 如何在Python中实现这一点 # -*- coding: utf-8 s = u'访视频'.encode('latin-1') 导致此异常的原因: s = u'访视频'.encode('latin-1') UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-2: ordinal not in

我想这样做:

取此utf-8字符串的字节:

访视频

用拉丁语1对这些字节进行编码并打印结果:

èè视è

如何在Python中实现这一点

# -*- coding: utf-8
s = u'访视频'.encode('latin-1')
导致此异常的原因:

s = u'访视频'.encode('latin-1')
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-2: ordinal not in range(256)

你要求做的事情实际上是不可能的。您不能将这些字符编码为Latin-1,因为这些字符在Latin-1中不存在

要获得所需的输出,需要将UTF-8字节解码为拉丁语-1。像这样:

s = u'访视频'.encode('utf-8').decode('latin-1')
但是,所需的输出看起来与实际的拉丁语-1不同,因为在拉丁语-1中,字符
\x86
\x91
是不可打印的,因此您将得到以下结果:

è®¿è§ é¢

(注意中间的空间代替了<代码> ,以及结尾的缺失<代码> <代码>;那些实际上是看不见的控制字符,而不是空格。 看起来您需要一个拉丁语-1超集,可能是Windows代码页1252。在这种情况下,您真正想要的是:

s = u'访视频'.encode('utf-8').decode('cp1252')

您需要首先编码到
UTF-8
UTF-8
可以编码任何Unicode字符串),并且与
7位ASCII
集完全兼容(任何ASCII bytestring都是正确的
UTF-8–编码的
string):

注意:UTF-8编码可以处理任何Unicode字符。这也是倒退 与
ASCII
兼容,因此纯
ASCII
文件也可以被视为
UTF-8
文件,而恰好只使用
ASCII
字符的
UTF-8
文件与
ASCII
具有相同字符的文件

Hmm,我在Mac上,使用ISO-8559-1编码检索该字符串,但您的第二个示例正是我想要的。谢谢@OregonTrail:很多网站、文本文件等都声称它们在ISO-8859-1(不是8559,但我确信这是一个毫无意义的输入错误)中,而实际上它们在一些扩展版本中,因为作者不知道它们之间的区别。尤其是Windows用户,他们认为自己的OEM代码页(通常是cp1252)是拉丁语-1。(你也曾偶尔看到Windows使用代码页将MacRoman重新映射为拉丁语,我忘记了数字,但那是很久以前的事了。)你知道如何做相反的事情吗?带上“èèèèèèèè视èè”然后回去”访视频". 我似乎无法让它工作。好的,所以
s.encode('latin-1')。decode('utf-8'))
显然在本例中有效,但我在实际的代码库中遇到了一个更大的问题,我无法确定。@OregonTrail:正如我在回答中所解释的,
\x86
\x91
是不可打印的控制字符,而不是
'
,拉丁语中没有任何内容是
'
>因此,当然
“èèèèèè视èèèèèèèèèèèèèèèèèèèèèè。
>>> u'访视频'.encode('UTF-8').decode('latin-1')
u'\xe8\xae\xbf\xe8\xa7\x86\xe9\xa2\x91'