3

我在将带有重音符号的字符串参数传递给我的 Django 应用程序时遇到了一些问题。我有以下网址模式:

url(r'^galeria/(?P<page>\d+)/(?P<order>\w+)/(?P<query>[\w|\W]+)', 'possible_brastemp.views.gallery_with_page_and_query'),

当我尝试这样的网址时:

 http://127.0.0.1:8000/galeria/1/ultimos/Julian%20Andr%E9s

模式不匹配。我已将问题隔离到 '%E9' 字符('%20' 不会破坏匹配)。

如何更改正则表达式以将参数与编码字符匹配?

谢谢

4

1 回答 1

5

在 URL 中使用%c3%a9而不是。%e9正则表达式没有失败...... Django 甚至没有进入 urlconf。检查日志,您可能会收到 400 个错误。

URI 路径应仅包含 UTF-8 编码的字符。任何不能表示为正常的、可打印的 ASCII 字符(并且不在保留列表中)的 UTF-8 字符都应该进行百分比编码。

é(U+00E9) 是 UTF-8 中的多字节字符:0xc3a9。百分比编码的形式是%C3%A9. 单字节 0xe9 不是有效的 UTF-8 字符。

请参阅RFC 3986

[\w|\W]+成功匹配包含%C3%A9. Django 似乎将 URL 字节字符串百分比解码为 Unicode 字符串,然后将其转换为 UTF-8 以进行 urlconf 匹配。

于 2012-07-27T21:52:39.227 回答