R 中的 URL / URI 编码

Tau*_*Tau 6 post encoding parsing get r

我必须根据 RFC 3986 请求带有 URL 编码的 API,因为我知道我的查询中有重音字符。

例如,这个论点:

quel écrivain ?
Run Code Online (Sandbox Code Playgroud)

应该像这样编码:

quel%20%C3%A9crivain%20%3F%0D%0A
Run Code Online (Sandbox Code Playgroud)

不幸的是,当我使用 URLencode、encoding、url_encode 或 curlEscape 时,我得到了编码结果:

URLencode("quel écrivain ?")
[1] "quel%20%E9crivain%20?"
Run Code Online (Sandbox Code Playgroud)

问题出在重音字母上:例如“é”被转换为“%E9”而不是“%C3%A9”......

我在使用这种 URL 编码时没有发现任何问题……因为我不了解 API,所以我不知道它是如何处理编码的。

奇怪的是,使用 POST 而不是 GET 会导致响应,其中带有重音的单词被切成 2 行:

"1\tquel\tquel\tDET\tDET\tGender=Masc|Number=Sing\t5\tdet\t0\t_\n4\t<U+FFFD>\t<U+FFFD>\tSYM\tSYM\t_\t5\tcompound\t0\t_\n5\tcrivain\tcrivain\
Run Code Online (Sandbox Code Playgroud)

如您所见,“écrivain”被拆分为"<U+FFFD>"(这是“é”的 ASCII 编码)和"crivain".

我对这个编码问题很生气,如果有聪明的头脑可以帮助我,我将不胜感激!

use*_*745 7

reserved = TRUE

IE

your_string <- "quel écrivain ?"

URLencode(your_string, reserved = TRUE)
# [1] "quel%20%C3%A9crivain%20%3F"
Run Code Online (Sandbox Code Playgroud)


Man*_*kel 3

我不认为我是一个聪明的人,但我仍然有一个可能的解决方案给你。使用后,URLencode()您的重音字符似乎被转换为其 unicode 表示形式的尾部部分,前面带有%. 要将字符转换为可读字符,您可以将它们转换为“真正的 unicode”并使用该包stringi使它们可读。对于您的单字符串,该解决方案至少在我的机器上有效。我希望它也适合你。

\n\n

%请注意,我在字符串末尾引入了一个字符,以证明以下gsub命令在任何情况下都应该有效。

\n\n

您可能需要调整替换模式\\\\u00以覆盖超过最后两个位置的 unicode 模式0,但如果这与您的情况相关的话。

\n\n
library(stringi)\nstr <- "quel \xc3\xa9crivain ?"\nstr <- URLencode(str)\n#"quel%20%E9crivain%20?"\n#replacing % by a single \\ backslash to directly get correct unicode representation\n#does not work since it is an escape character, therefore "\\\\"\nstr <- gsub("%", paste0("\\\\", "u00"), str , fixed = T)\n#[1] "quel\\\\u0020\\\\u00E9crivain\\\\u0020?"\n#since we have double escapes, we need the unescape function from stringi\n#which recognizes double backslash as single backslash for the conversion\nstr <- stri_unescape_unicode(str)\n#[1] "quel \xc3\xa9crivain ?"\n
Run Code Online (Sandbox Code Playgroud)\n

  • 我很高兴能为您指出一个可行的解决方案。有人曾经说过“编码只会让程序员发疯”:-)。 (2认同)