在R中读取UTF-8编码瑞典语XML文件时特殊字符乱码如何解决?
解决瑞典语XML特殊字符乱码问题
你的乱码问题是编码不匹配/双重解码导致的:XML声明标注UTF-8,但服务器实际返回的内容可能采用Latin-1(ISO-8859-1)编码,手动指定UTF-8解码会破坏原始字符的字节结构,出现å变Ã¥这类乱码。以下是几种可行的解决方法:
方法一:让XML解析器自动处理原始二进制内容
跳过手动转文本的步骤,直接把响应的原始二进制内容传给xmlParse,它会根据XML开头的编码声明自动识别并解析:
library(httr) library(XML) UA <- "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36" my_url <- "https://weburn.kb.se/riks/tv%C3%A5kammarriksdagen/xml/1867/web_mot_1867__fk__1/mot_1867__fk__1.xml" my_doc <- GET(my_url, user_agent(UA)) # 传入原始二进制内容,交由xmlParse自动处理编码 res <- xmlParse(content(my_doc, "raw"))
方法二:匹配服务器实际返回的编码
先检查服务器响应头里的官方编码声明:
# 查看Content-Type头,确认服务器指定的编码 headers(my_doc)$`content-type`
如果返回结果包含charset=ISO-8859-1,就用该编码读取文本内容:
res <- xmlParse(content(my_doc, "text", encoding = "ISO-8859-1"))
方法三:用xml2包替代(推荐)
xml2包的read_xml对编码的自动处理逻辑更健壮,能规避很多传统XML解析库的编码问题:
library(httr) library(xml2) UA <- "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36" my_url <- "https://weburn.kb.se/riks/tv%C3%A5kammarriksdagen/xml/1867/web_mot_1867__fk__1/mot_1867__fk__1.xml" my_doc <- GET(my_url, user_agent(UA)) res <- read_xml(content(my_doc, "raw")) # 验证特殊字符是否正常显示 xml_text(xml_find_first(res, "//formatting"))
问题根源
你之前的代码中,content(my_doc, "text", encoding = "UTF-8")强制用UTF-8解码,但服务器实际返回的内容是Latin-1编码,导致UTF-8解码时把原单字节字符拆分成了错误的多字节序列,最终出现乱码。让解析器直接处理原始内容,或匹配正确的编码,就能恢复å、ä、ö等特殊字符的正常显示。
内容的提问来源于stack exchange,提问作者Tordir
相关产品推荐
相关产品推荐

