【问题标题】:URL / URI encoding in RR中的URL / URI编码
【发布时间】:2017-12-20 11:14:27
【问题描述】:

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

例如,这个论点:

quel écrivain ?

应该这样编码:

quel%20%C3%A9crivain%20%3F%0D%0A

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

URLencode("quel écrivain ?")
[1] "quel%20%E9crivain%20?"

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

我在处理这种 URL 编码时遇到了问题,但没有发现任何问题……因为我没有掌握 API,所以我不知道它如何处理编码。

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

"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\

如您所见,“écrivain”分为"&lt;U+FFFD&gt;"(这是“é”的ASCII编码)和"crivain"

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

【问题讨论】:

    标签: r parsing post encoding get


    【解决方案1】:

    设置reserved = TRUE

    your_string <- "quel écrivain ?"
    
    URLencode(your_string, reserved = TRUE)
    # [1] "quel%20%C3%A9crivain%20%3F"
    

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 谢谢曼努埃尔,我没有做同样的事情,但stri_unescape_unicode 是一个很好的调用函数! 1.我首先将stri_escape_unicode应用于我的POST查询的主体,2.然后我将stri_unescape_unicode函数应用于响应内容,并且编码是ok的!
      • 我很高兴能为您指出一个可行的解决方案。有人曾经说过“编码只会让程序员发疯”:-)。
      • 我完全同意 ;)
      猜你喜欢
      • 2012-12-28
      • 2011-06-27
      • 1970-01-01
      • 2011-06-18
      • 2012-06-17
      • 2016-04-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多