Как правильно обрабатывать экранированные символы 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"
Вуаля проблема решена.