Как правильно обрабатывать экранированные символы Unicode в библиотеке RJSONIO R при чтении json из файла

Я использую RJSONIO R для чтения JSON из файла. JSON содержит символы Unicode, которые читаются неправильно.

Код работает, когда json передается в виде строки, как показано автором пакета R в вопросе о stackru. Как правильно работать с экранированными символами Unicode в R, например em dash (-).

Однако когда json читается из файла, он не выдает правильное представление в юникоде. Как видно ниже:

fromJSON(content="~/MTS/temp")
$query
$query$categorymembers
$query$categorymembers[[1]]
$query$categorymembers[[1]]$ns
[1] 0
$query$categorymembers[[1]]$title
[1] "Banach\023Tarski paradox"

Где ~/MTS/temp содержит:

{"query":{"categorymembers":[{"ns":0,"title":"Banach\u2013Tarski paradox"}]}}`

1 ответ

Альтернативный пакет под названием jsonlite работает так, как вы ожидаете, в моей системе (OS X), но я проверял, что RJSONIO этого не делает. Это после того, как я сохранил ваш фрагмент JSON в файл с именем utext.txt:

file.show("utext.txt")
## {"query":{"categorymembers":[{"ns":0,"title":"Banach\u2013Tarski paradox"}]}}
jsonlite::fromJSON("~/temp/utext.txt")
## $query
## $query$categorymembers
##   ns                 title
## 1  0 Banach–Tarski paradox

Вот еще одно решение, которое немного зависит от платформы: закодируйте экранированные файлы Unicode перед их чтением. (Есть ли у вашей платформы эта утилита, я не знаю, но даже для Windows вы, вероятно, можете найти ее.)

Моя системная кодировка локали - UTF-8 (стандарт OS X), поэтому, когда я запускаю утилиту командной строки native2ascii Я могу закодировать его как UTF-8, а затем прочитать его в R, где моя локаль установлена ​​в en_GB.UTF-8.

Из терминала / оболочки:

native2ascii -reverse ~/temp/utext.txt ~/temp/utextUTF8.txt

Тогда в R:

RJSONIO::fromJSON("~/temp/utextUTF8.txt")
## $query
## $query$categorymembers
## $query$categorymembers[[1]]
## $query$categorymembers[[1]]$ns
## [1] 0
## 
## $query$categorymembers[[1]]$title
## [1] "Banach–Tarski paradox"

Вуаля проблема решена.

Другие вопросы по тегам