在Linux上使用丹麦语字符编码字符串

时间:2014-01-28 12:35:04

标签: python linux python-2.7 unicode urlencode

我在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服务器上的编码,但我的想法已经用完了。有没有人有任何建议?

0 个答案:

没有答案