如何将Unicode转义序列URL转换为Python Unicode?

0 投票
2 回答
2077 浏览
提问于 2025-04-16 08:55

如果网址里有一些Unicode字符,并且在客户端用JavaScript(比如用escape(text))进行了转义,那么该怎么处理呢?举个例子,如果我的网址是:domain.com/?text=%u05D0%u05D9%u05DA%20%u05DE%u05DE%u05D9%u05E8%u05D9%u05DD%20%u05D0%u05EA%20%u05D4%u05D8%u05E6%u05D8%20%u05D4%u05D6%u05D4

我试过这样做:text = urllib.unquote(request.GET.get('text')),但我得到的结果还是一样的字符串(%u05D0%u05D9%u05DA%20%u05DE ...)。

2 个回答

0

因为你的 %uxxxx 不是 Python 标准的写法,Python 标准是 \uxxxx,所以你需要一个比较复杂的方法来把 '%' 替换成 '\',像下面这样(我在我的 Python 环境中测试过):

>>> import sys; reload(sys); sys.setdefaultencoding('utf8')
<module 'sys' (built-in)>
>>> text = '%u05D0%u05D9%u05DA%20%u05DE%u05DE%u05D9%u05E8%u05D9%u05DD%20%u05D0%u05EA%20%u05D4%u05D8%u05E7%u05E1%u05D8%20%u05D4%u05D6%u05D4'
>>> text = text.replace('%', '\\')
>>> text_u = text.decode('unicode-escape')
>>> print text_u
איךממיריםאתהטקסטהזה

在转换成 Unicode 类型之后,你就可以把它转换成你想要的任何编码,像下面这样:

>>> text_utf8 = text_u.encode('utf8')
>>> text_utf8
'\xd7\x90\xd7\x99\xd7\x9a\x10\xd7\x9e\xd7\x9e\xd7\x99\xd7\xa8\xd7\x99\xd7\x9d\x10\xd7\x90\xd7\xaa\x10\xd7\x94\xd7\x98\xd7\xa7\xd7\xa1\xd7\x98\x10\xd7\x94\xd7\x96\xd7\x94'
>>> print text_utf8
איךממיריםאתהטקסטהזה
3

最后我做的就是把客户端的代码从 escape(text) 改成了 urlEncodeComponent(text)。

然后在 Python 这边,我用了:

request.encoding = 'UTF-8'
text = unicode(request.GET.get('text', None))

我不确定这样做是否是最好的方法,但在英语和希伯来语中都能正常工作。

撰写回答