поведение writeLines со специальными символами - PullRequest
0 голосов
/ 04 мая 2019

При запуске следующей строки в R (R Studio):

writeLines("hello \U1F30D",useBytes = T)

Я получаю разные результаты.

С ПК я получаю

hello ðŸŒ

или

writeLines("hello \U1F30D",useBytes = F)
hello <U+0001F30D>

А с маком

writeLines("hello \U1F30D",useBytes = F)
hello ?

Я думаю, что поведение не из-за машины.Это должна быть кодировка.Но я проверил кодировку R Studio, это UTF-8 для обоих.Так что теперь я понятия не имею, почему существует другое поведение, кто-нибудь может объяснить различия?

1 Ответ

1 голос
/ 06 мая 2019

Я написал несколько подробный ответ на этот вопрос здесь: https://kevinushey.github.io/blog/2018/02/21/string-encoding-and-r/

Краткий ответ: writeLines("<text>", useBytes = FALSE) попытается перекодировать предоставленный текст в собственную кодировку. Это работает в системах Unix, использующих локаль UTF-8 (которая в настоящее время используется по умолчанию), но завершится сбоем, если это не так (то есть в Windows). По сути, вам нужно что-то вроде:

writeLines("<text>", file, useBytes = TRUE)
readLines(file, encoding = "UTF-8")

Обратите внимание, что диагностика проблем кодирования в Windows может быть сложной, поскольку R довольно агрессивно перекодирует текст UTF-8 в собственную кодировку (иногда пытается выполнить обход UTF-8 -> native -> UTF-8) и что конверсия обычно с потерями.

...