【问题标题】:R fromJSON incorrectly reads Unicode from fileR fromJSON 错误地从文件中读取 Unicode
【发布时间】:2015-10-09 05:48:22
【问题描述】:

我正在尝试从文件中读取 R 中的 json 对象,该文件包含 unicode 中的姓名和姓氏。这是文件“x1.json”的内容:

{"general": {"last_name":
"\u041f\u0430\u0449\u0435\u043d\u043a\u043e", "name":
"\u0412\u0456\u0442\u0430\u043b\u0456\u0439"}}

我使用RJSONIO包,当我直接声明JSON对象时,一切顺利:

x<-fromJSON('{"general": {"last_name": "\u041f\u0430\u0449\u0435\u043d\u043a\u043e", "name": "\u0412\u0456\u0442\u0430\u043b\u0456\u0439"}}')
x
# $general
# last_name      name 
# "Пащенко" "Віталій" 

但是当我从文件中读取相同的内容时,字符串会转换为我未知的编码:

x1<-fromJSON("x1.json")
x1
# $general
#    last_name         name 
# "\0370I5=:>" "\022VB0;V9" 

请注意,这些不是转义的“\u”(was discussed here

我试图指定“编码”参数,但这没有帮助:

> x1<-fromJSON("x1.json", encoding = "UTF-8")
> x1
$general
   last_name         name 
"\0370I5=:>" "\022VB0;V9" 

系统信息:

> Sys.getlocale()
[1] "LC_COLLATE=Ukrainian_Ukraine.1251;LC_CTYPE=Ukrainian_Ukraine.1251;LC_MONETARY=Ukrainian_Ukraine.1251;LC_NUMERIC=C;LC_TIME=Ukrainian_Ukraine.1251"

切换到英语 (Sys.setlocale("LC_ALL","English")) 并没有改变这种情况。

【问题讨论】:

  • 你有什么理由不使用rjson 包吗?它适用于它的功能fromJSON
  • @Pascal 说了什么,见stackoverflow.com/questions/30580601/…
  • @Pascal,不幸的是,对我来说它没有(我忘了在最初的帖子中提到这一点):x1&lt;-RJSONIO::fromJSON("x1.json")&gt; x1$general`last_name name`"\0370I5=:&gt;" "\022VB0;V9" &gt; rm(x1)@ 987654336@Error in rjson::fromJSON("x1.json") : unexpected character 'x'&gt; x1Error: object 'x1' not found
  • 您需要阅读帮助页面。语法不同。
  • @Pascal,x1&lt;-rjson::fromJSON(file="x1.json") 成功了,非常感谢!

标签: json r unicode character-encoding


【解决方案1】:

如果您的文件有这样的 unicode 数据(而不是其表示形式)

{"general": {"last_name":"Пащенко", "name":"Віталій"}}

那么,

> fromJSON("x1.json", encoding = "UTF-8")

会起作用

如果您真的希望您的代码与当前文件一起使用,请尝试这样

JSONstring=""
con  <- file("x1.json",open = "r")
while (length(oneLine <- readLines(con, n = 1, warn = FALSE)) > 0) {
JSONstring <- paste(JSONstring,parse(text = paste0("'",oneLine, "'"))[[1]],sep='')
}
fromJSON(JSONstring)

【讨论】:

  • 它适用于来自rjson 包的fromJSON,无需操作,正如我 3 小时前所说。
【解决方案2】:

使用库(“jsonlite”)而不是 rjson

library("jsonlite")
mydf <- toJSON( mydf, encoding = "UTF-8")

会好的

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-06-17
  • 2016-11-15
  • 2019-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多