RCurl处理含非罗马UTF-8字符的URL时报invalid URL错误
问题根因
URL规范要求只能包含ASCII字符,直接在URL中写入中文等非ASCII字符不符合规范。你粘贴到浏览器时浏览器会自动完成非ASCII字符的URL百分号编码,因此可以正常访问;但RCurl的getURL函数默认不会对输入的URL字符串做自动编码处理,因此会抛出invalid URL错误。
解决方案
方案1:直接对构造完成的URL做编码
调用R内置的URLencode()函数处理你拼接好的query_url即可,该函数会自动将非ASCII字符转为符合规范的百分号编码格式,且不会转义&、=等URL保留字符:
library(RCurl) term <- "日本" query_url <- paste("https://iss.ndl.go.jp/api/sru?operation=searchRetrieve&recordSchema=dcndl&recordPacking=xml&query=anywhere=", term,"%20AND%20from%20=%201887%20AND%20until=%201887", sep="") # 新增URL编码步骤 encoded_url <- URLencode(query_url) getURL(encoded_url, .encoding = "UTF8")
方案2:单独对查询参数编码(更规范,适合多参数场景)
如果后续需要拼接多个动态参数,建议提前对每个非ASCII参数单独做编码,避免保留字符被误转义:
library(RCurl) term <- "日本" # 单独编码搜索关键词 encoded_term <- URLencode(term) query_url <- paste("https://iss.ndl.go.jp/api/sru?operation=searchRetrieve&recordSchema=dcndl&recordPacking=xml&query=anywhere=", encoded_term,"%20AND%20from%20=%201887%20AND%20until=%201887", sep="") getURL(query_url, .encoding = "UTF8")
内容的提问来源于stack exchange,提问作者Mark R
相关产品推荐
相关产品推荐

