如何在Python中将UTF8字符串从app保存到webserver

时间:2014-08-01 06:30:11

标签: python utf-8

我有一个向Python网络服务器提交请求的应用。该应用程序具有UTF8字符串,其中包含以下内容:

  

lalanguefranþaise.ppt

将其放入HTTP标头,并以某种方式转换为:

  

la langue fran \ xfeaise.ppt

然后,Web服务器上的Python试图对可能期望它为UTF8的字符串做一些事情,我收到此错误:

  

UnicodeDecodeError:'utf8'编解码器无法解码位置14的字节0xfe:无效的起始字节

我基本上希望将这个UTF8从应用程序保存到Web服务器,这样如果我打印它,变量将包含以下内容:

  

lalanguefranþaise.ppt

从Web客户端和服务器保留UTF8字符串的最佳方法是什么(假设两者都是用Python编写的)?

4 个答案:

答案 0 :(得分:2)

\xfe是þ。

的ISO-8859-1编码

虽然广泛支持 content 中的utf8,但HTTP 标头应为ASCII。 HTTP规范允许ISO-8859-1,但在工具中不推荐或不可靠。如果没有特殊的逃避,其他编码是不允许的。

如果可能的话,以允许它们作为ASCII传输的方式转义您的特殊字符。 fileoffset建议的Base64是一个选项,另一个是来自quote的{​​{1}}函数(或python2上的urllib.parse

答案 1 :(得分:2)

HTTP标头严格为7位US ASCII。 RFC允许您接受 ISO8859-1作为兼容性攻击,但不发送超过127的任何字节。

在标题中,没有标准或最佳方式在ASCII旁边发送任何其他数据类型。您的应用程序负责编码任意字节序列(并且您的UTF字符串是任意字节序列),以便编码是7位安全的。

在客户端和服务器的实现语言中使用最方便的方法。 Base64编码,\ hh字节转义,\ uhhhh unicofe字符转义,%hh根据URL编码,= HH,如MIME,或&#...实体。所有这些方法都存在并且正在野外使用。

答案 2 :(得分:0)

尝试使用编解码器解码您的字符串:'iso-8859-1' 有关详细信息,请查看here

答案 3 :(得分:0)

你有一个字节字符串(已经解码)。

要打印它,您需要先对其进行编码,以便将\xfe组合转换为与其等效的字符。

为了知道\xfe应该是什么,你需要告诉Python你打印时要使用的编码 - 你还需要确保打印它的位置(例如,在终端上) )字体可以处理字符符号;否则你会得到垃圾输出。

如果一切正常,您将获得以下内容:

>>> i = "la langue fran\xfeaise.ppt"
>>> print(i.decode('iso-8859-1'))
la langue franþaise.ppt

请注意,您的字符串不是UTF-8编码的,因此如果您尝试将其解码为UTF-8,则会出现以下常见错误:

>>> print(i.decode('utf-8'))
...
UnicodeDecodeError: 'utf8' codec can't decode byte 0xfe in position 14:
invalid start byte

要转换它,首先必须从原始字符集中解码它,然后将其重新编码为utf-8:

>>> z = i.decode('iso-8859-1').encode('utf-8')
>>> z
'la langue fran\xc3\xbeaise.ppt'
>>> i
'la langue fran\xfeaise.ppt'

注意表示相同字符的字节差异。最后,当你打印它时,它会正确打印(假设你的终端字体可以处理字形):

>>> print(z.decode('utf-8'))
la langue franþaise.ppt