【问题标题】:Encoding special characters for passing to a URL编码特殊字符以传递到 URL
【发布时间】:2019-03-22 14:19:10
【问题描述】:

我正在尝试学习 Python,所以我想我会先尝试查询 IMDB 以对照 IMDB 检查我的电影收藏;进展顺利????

我坚持的是如何处理名称中的特殊字符,并将名称编码为 URL 将尊重的内容。

例如我有电影Brüno

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

我假设编码使用的是不同的标准,但我无法确定我需要做什么

【问题讨论】:

  • 这实际上是 IMDB 的一个错误(当然,这不会立即帮助 )。
  • @KonradRudolph - 只是出于好奇,为什么这会被视为 IMDB 方面的错误?是否有标准或其他原因不应该在 url 编码中使用 NFC 形式?
  • @benvc 搜索 API 不应假定任何一个输入规范化,而是执行自己的规范化,或者以其他方式确保无论输入如何规范化都能找到相关结果:Unicode 标准在this: “Brüno” = “Brüno”,即使第一个字符串使用专用代码点,而第二个字符串使用组合变音符号。比较必须发生在字素簇的级别,而不是字节或代码点的级别。
  • @KonradRudolph - 有道理,感谢您花时间解释。

标签: python python-3.x urlencode omdbapi


【解决方案1】:

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

>>> import unicodedata
>>> "Brüno".encode("utf-8")
b'Bru\xcc\x88no'
>>> unicodedata.normalize("NFC", "Brüno").encode("utf-8")
b'Br\xc3\xbcno'

一些字素(你视为一个“字符”的东西),尤其是那些带有变音符号的字素可以由不同的字符组成。 “ü”可以是“u”,带有分词组合,也可以是字符“ü”本身(组合形式)。并非所有字母和变音符号的组合都存在组合形式,但它们适用于常用组合(= 常见语言中的组合)。

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

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

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

【讨论】:

  • 技术上归一化的结果一种编码。 Unicode 上下文中的“编码”(如您的答案)通常是指不同的 UTF(即代码点的编码),但编码的含义更普遍。 Br%C3%BCnoBru%CC%88no 是“Brüno”信息的两种不同编码形式。
  • 作为一个可能对某些人有用的小补充,您还可以使用unicodedata.normalize("NFD", "Brüno").encode("utf-8") 显式获取可比较的NFD 输出b'Bru\xcc\x88no',以说明在每个实例中使用哪种规范化形式。
  • @KonradRudolph 是和否:归一化的结果仍然是str 的一个实例,而不是bytes,它只会改变使用了哪些unicode 代码点。还没有声明这些是如何表示的。但是,是的,计算机中的所有字符串都以某种方式编码,甚至是“Unicode 字符串”。
猜你喜欢
  • 2014-09-17
  • 1970-01-01
  • 1970-01-01
  • 2014-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-26
相关资源
最近更新 更多