【问题标题】:R does not show special characters coming from json sourceR 不显示来自 json 源的特殊字符
【发布时间】:2017-09-08 10:31:54
【问题描述】:

关于背景的一点点。 我从提供公共交通数据的 API 中提取数据。它以 json 格式返回结果,我使用库 'jsonlite' 进行处理。

 resp <- GET(url = url)


  resp_char <- rawToChar(resp$content)
  parsed <- fromJSON(resp_char, flatten = T)

  parsed.df <- do.call(what = "rbind", args = lapply(parsed[1], as.data.frame))

问题是,结果中没有特殊字符。

我正在使用 Windows Server 2012 机器,我在 R 中的语言设置如下所示:

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

例子:

    > df$direction
"U Alt-Mariendorf (Berlin)" 
"U Alt-Tegel (Berlin)" 
"U Alt-Mariendorf (Berlin)"              
"U Alt-Tegel (Berlin)" 
"Märkisches Viertel, Wilhelmsruher Damm"

第五个结果的预期结果是“Märkisches Viertel, Wilhelmsruher Damm”

之后我查看了实际的编码。

> Encoding(df$direction)
   [1] "unknown" "unknown" "unknown" "unknown" "UTF-8"

到目前为止,我认为这看起来不错,但是我看不到特殊字符。

感谢您对此主题的任何建议和想法。

问候

【问题讨论】:

  • 你试过这个功能iconv吗?
  • 是的,我试过了。这就是结果 > iconv(tmpStore2$direction,to ="UTF8") [1] "U Alt-Mariendorf (Berlin)" "U Alt-Tegel (Berlin)" "U Alt-Mariendorf (Berlin)" [4] “U Alt-Tegel(柏林)”“Märkisches Viertel,Wilhelmsruher Damm”

标签: json r windows utf-8 jsonlite


【解决方案1】:

所以我终于明白了。 感谢@parth,它让我找到了正确的答案。 我在 fromJSON 语句之前使用了 Encoding,这对我有用。

  resp <- GET(url = url)

  resp_char <- rawToChar(resp$content)
  Encoding(resp_char) <- "UTF-8"
  parsed <- fromJSON(resp_char, flatten = T)

  parsed.df <- do.call(what = "rbind", args = lapply(parsed[1], as.data.frame))

【讨论】:

    【解决方案2】:

    使用数据框

    df&lt;-data.frame(direction=c("U Alt-Mariendorf (Berlin)","U Alt-Tegel (Berlin)","U Alt-Mariendorf (Berlin)","U Alt-Tegel (Berlin)","Märkisches Viertel, Wilhelmsruher Damm"), stringsAsFactors = FALSE)

    > df
                                    direction
    1               U Alt-Mariendorf (Berlin)
    2                    U Alt-Tegel (Berlin)
    3               U Alt-Mariendorf (Berlin)
    4                    U Alt-Tegel (Berlin)
    5 Märkisches Viertel, Wilhelmsruher Damm
    

    现在,只需将整个 df$direction 列的编码更改为

    Encoding(df$direction) <- "UTF-8"
    

    解决了这个问题

    > df
                                   direction
    1              U Alt-Mariendorf (Berlin)
    2                   U Alt-Tegel (Berlin)
    3              U Alt-Mariendorf (Berlin)
    4                   U Alt-Tegel (Berlin)
    5 Märkisches Viertel, Wilhelmsruher Damm
    

    【讨论】:

    • 不幸的是它只是在你的例子中工作。不同之处在于,我的 Dataframe 已经是 UTF-8 编码的(见上文)。您的代码在 Latin1 中,然后它可以工作..(将我的数据框转换为 latin1 并返回 utf-8 不起作用)
    猜你喜欢
    • 1970-01-01
    • 2013-11-11
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    相关资源
    最近更新 更多