我在SUSE Enterprise服务器上运行了一个小型的Python web.py应用程序。该应用程序的目的是通过HTTP POST接收urlencoded字符串,验证输入,形成一些XML,然后将该XML发送到另一个HTTP POST服务。
一切都很有效,除非urlencoded输入包含任何丹麦字符,也可能包含其他特殊字符。
我正在尝试对字符串“æøåÆØÅ”进行urldecode。 Urlencoded字符串看起来像这样:“%C3%A6%C3%B8%C3%A5%C3%86%C3%98%C3%85”
为了分析问题,我创建了一个小样本应用程序来说明问题。
我使用了答案中的诀窍:python url unquote unicode
import urllib2
s1 = "%C3%A6%C3%B8%C3%A5%C3%86%C3%98%C3%85"
print "s1", s1
s2 = urllib2.unquote(s1.encode('ascii'))
print "s2", repr(s2), s2
s3 = s2.decode('utf-8')
print "s3", repr(s3), s3
问题是代码在Windows 7中按预期工作,但在托管应用程序的Linux(SUSE)上,输出是垃圾。
在Windows 7中运行时的输出:
s1 %C3%A6%C3%B8%C3%A5%C3%86%C3%98%C3%85
s2 '\xc3\xa6\xc3\xb8\xc3\xa5\xc3\x86\xc3\x98\xc3\x85' ├ª├©├Ñ├å├ÿ├à
s3 u'\xe6\xf8\xe5\xc6\xd8\xc5' æøåÆØÅ
在SUSE中运行时的输出:
s1 %C3%A6%C3%B8%C3%A5%C3%86%C3%98%C3%85
s2 '\xc3\xa6\xc3\xb8\xc3\xa5\xc3\x86\xc3\x98\xc3\x85' æøåÃÃÃ
s3 u'\xe6\xf8\xe5\xc6\xd8\xc5' æøåÃÃÃ
显然\ xc5成为换行符。在s3中也有一个换行符,但我在代码标签中没有空行。
此外,在SUSE
上运行此代码时for c in s3:
print repr(c), unicodedata.name(c)
我得到以下内容:
u'\xe6' LATIN SMALL LETTER AE
u'\xf8' LATIN SMALL LETTER O WITH STROKE
u'\xe5' LATIN SMALL LETTER A WITH RING ABOVE
u'\xc6' LATIN CAPITAL LETTER AE
u'\xd8' LATIN CAPITAL LETTER O WITH STROKE
u'\xc5' LATIN CAPITAL LETTER A WITH RING ABOVE
因此,似乎Python正确解释了字符串,但在将字符串打印到控制台或文件或XML字符串时无法正确显示它。
我猜这个问题是Linux服务器上的编码,但我的想法已经用完了。有没有人有任何建议?