python 2字节字符串,未在utf-8中编码

时间:2019-06-02 19:31:06

标签: python python-2.7 unicode

我维护了一个可以从多种语言输入文本的api。我们希望将字符串的编码设置为(>= x y)

以前的开发人员尝试过的大多数解决方案都涉及使用编码和解码功能willy nilly。只会导致混乱的无法维护的代码。

为简单起见,我仅在此处定义utf-8,但可以想象一下它可以发送到我的api。该字符串编码为x

latin-1

结果

x = '\xe9toile' # x is a byte string in python 2
x.encode('utf-8')

我唯一知道将其编码为*** UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 0: ordinal not in range(128) 的方法是首先将其解码为utf-8然后进行编码。

latin-1

如果我不知道字节字符串是用x.decode('latin-1') >>u'\xe9toile' (x.decode('latin-1')).encode('utf-8') >>'\xc3\xa9toile' 编码的,我怎么能将其编码为latin-1呢?

如果utf-8是我不知道的中文编码,怎么办?

x

x = '\u54c8\u54c8' 始终是字节字符串。 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

如果x是一个字节字符串,那么对它进行编码就没有意义。文本编码是一种将文本表示为字节的方法。您首先必须通过解码将字节转换为文本,然后将该文本编码为目标编码。

  

如果我不知道字节字符串是用latin-1编码的,那我怎么能将其编码为utf-8呢?

您可以尝试猜测编码,但不一定总是正确的:

>>> 'Vlh'.encode('cp037')
'\xe5\x93\x88'
>>> '哈'.encode('utf-8')
'\xe5\x93\x88'

此示例有些人为设计,但是除非您知道原始编码,否则无法知道字节'\xe5\x93\x88'还是Vlh

最明智的解决方案是,让客户将其文本编码为UTF-8,然后对接收到的字节解码为UTF-8。