R:`geojson_read()` 在 Windows 上读取 UTF-8 文件导致在 `@data` 槽中出现奇怪的字符

R: `geojson_read()` read UTF-8 file on Windows results in weird characters in `@data` slot

当我使用 download.file 下载一些开放数据时,当我打开 temp.geojson 文件时,我可以看到 æ、ø 和 å 编码正确。

url <- "http://wfs-kbhkort.kk.dk/k101/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=k101:p_pladser&outputFormat=json&SRSNAME=EPSG:4326"
download.file(url, destfile = "temp.geojson")

但是,当我导入它时,æ、ø 和 å 变成了奇怪的字符。

library(geojsonio)
p_pladser <- geojson_read(x = "temp.geojson", what = "sp")
p_pladser <- geojson_read(x = "temp.geojson", what = "sp", encoding = "ISO-8859-1")
p_pladser <- geojson_read(x = "temp.geojson", what = "sp", encoding = "latin-1")
p_pladser <- geojson_read(x = "temp.geojson", what = "sp", encoding = "UTF-1")

不明白编码哪里出错了?下载数据到文件时,我不是应该可以自己定义我想要的编码吗?

如何让字符在 temp.geojson 文件中正确显示在 R 中?

注意:我使用的是 Windows10.

Windows 上的 UTF-8 问题很难处理。基本上,您可以将 UTF-8 文件转换为本机编码并读取转换后的文件,或者读取 UTF-8 文件并转换返回的 R 对象。

解释一下

使用geojson_read()读取下载的文件时出现编码问题。

这取决于您下载数据的位置。在url中,'?'之后的字符串,即"service=WFS&...&SRSNAME=EPSG:4326"是传递给网站的选项。例如,"outputFormat=json" 表示您需要 .json 文件。对于某些网站,您可以选择编码,例如 "encoding=UTF-8"。您需要参考目标网站的文档以获取详细信息。

您可以尝试以下解决方案,都可以。

解决方案

1

我用的是简体中文版(localeToCharset()"CP936")

utf8 <- readr::read_lines('temp.geojson')
native <- enc2native(utf8)
writeLines(native, 'native.geojson')

p_pladser <- geojsonio::geojson_read(x = "native.geojson", what = "sp")

检查结果

as.character(p_pladser@data$p_type)[998]
[1] "Uafm<U+00E6>rket parkering"

2

p_pladser <- geojsonio::geojson_read(x = "temp.geojson", what = "sp")

for (column in colnames(p_pladser@data)) {
    if (is.factor(p_pladser@data[ , column])) {
        char <- as.character(p_pladser@data[ , column])
        Encoding(char) <- 'UTF-8'
        p_pladser@data[ , column] <- as.factor(char)
    }
}

检查结果

as.character(p_pladser@data$p_type)[998]
[1] "Uafmærket parkering"

我不熟悉你的数据,所以我只能发现 p_pladser@data 不包含英文字符。如果你发现其他地方也没有英文字符,你需要像我一样转换它:

  1. 检索值(可能需要as.character()
  2. Encoding(..) <- "UTF-8"
  3. 分配回来(可能需要as.xxx()

更多

其实我刚花了一个星期的时间去研究Windows上的编码问题。您可以参考 https://github.com/viking/r-yaml/issues/38 了解更多信息。

你可以考虑Ubuntu系统,如果编码问题实在让你头疼