编码特殊字符以传递到URL

Phi*_*ilC 10 python urlencode python-3.x omdbapi

我正在尝试学习Python,所以我想首先尝试查询IMDB以对照IMDB检查我的电影收藏;一切顺利

我所坚持的是如何处理名称中的特殊字符,以及如何将名称编码为URL会尊重的名称。

例如我有电影 Bru?no

如果使用urllib.parse.quoteget 对字符串进行编码 - Bru%CC%88no 这意味着当我使用OMDBAPI查询IMDB时,找不到电影。如果我通过OMDBAPI网站进行搜索,则它们会将名称编码为,Br%C3%BCno并且此搜索有效。

我假设编码使用的是其他标准,但是我无法解决需要做的事情

L3v*_*han 8

它使用相同的编码,但是使用不同的规范化。

>>> import unicodedata
>>> "Bru?no".encode("utf-8")
b'Bru\xcc\x88no'
>>> unicodedata.normalize("NFC", "Bru?no").encode("utf-8")
b'Br\xc3\xbcno'
Run Code Online (Sandbox Code Playgroud)

某些字素(您看到的是一个“字符”),尤其是那些带有变音符号的字素可以由不同的字符组成。“ü”可以是带有组合偏音符的“ u”,也可以是字符“ü”本身(组合形式)。字母和变音符号的组合并非全都存在,但常用的字母和变音符却存在(表示通用语言的形式)。

Unicode规范化将形成字素的所有字符转换为组合或单独的字符。规范化方法“ NFC”或规范化形式规范组合尽可能地组合字符。

相比之下,另一种主要形式规范化形式规范分解或“ NFD”将生成您的版本:

>>> unicodedata.normalize("NFD", "Brüno").encode("utf-8")
b'Bru\xcc\x88no'
Run Code Online (Sandbox Code Playgroud)

  • 作为可能对某些人有用的次要补充,您还可以使用`unicodedata.normalize(“ NFD”,“Brüno”)。encode(“)显式地获得类似的NFD输出b'B'Bru \ xcc \ x88no'。 utf-8“)`来说明在每种情况下使用哪种规范化形式。 (3认同)