В Linux, R реагирует на значение переменной окружения LANG
. Если для него не задан языковой стандарт UTF-8, R не сможет управлять этим типом кодировки.
Так что если вызов R выполняется следующим образом (без UTF-8):
LANG=en_US R
консоль выдает:
a <- rawToChar(as.raw(c(0xc3, 0xa0)))
a
# [1] "\303\240"
tmp <- file("/tmp/foo", encoding="UTF-8")
writeLines(a, tmp)
# Warning message:
# In writeLines(a, tmp) : invalid char string in output conversion
close(tmp)
readLines("/tmp/foo")
# character(0)
Без языкового стандарта UTF-8 значение a
(с ударением a) печатается как необработанные байты. Принудительное кодирование UTF-8 при записи в файл выдает предупреждение и ничего не печатается.
Вызов с:
LANG=en_US.UTF-8 R
не дает ошибок:
a <- rawToChar(as.raw(c(0xc3, 0xa0)))
a
# [1] "à"
tmp <- file("/tmp/foo", encoding="UTF-8")
writeLines(a, tmp)
close(tmp)
readLines("/tmp/foo")
# [1] "à"
Проблема здесь в том, что трудно создавать переносимые сценарии, поскольку их результаты зависят от переменные среды.
В Windows R не реагирует на переменную LANG
, а кодировка зависит от установленного языка Windows. Для латинских языков это ANSI. Это упрощает переносимость внутри Windows, но R неправильно читает Linux файлы данных, основанные на UTF-8.