Как сохранить исходный () .R файл в кодировке UTF-8? - PullRequest
38 голосов
/ 17 февраля 2011

Следующее, когда копируется и вставляется непосредственно в R, работает нормально:

> character_test <- function() print("R同时也被称为GNU S是一个强烈的功能性语言和环境,探索统计数据集,使许多从自定义数据图形显示...")
> character_test()
[1] "R同时也被称为GNU S是一个强烈的功能性语言和环境,探索统计数据集,使许多从自定义数据图形显示..."

Однако, если я создаю файл с именем character_test.R, содержащий ТОЧНО ТО ЖЕ код, сохранит его в кодировке UTF-8 (чтобы сохранить специальные китайские символы), а затем я получу источник () это в R, я получаю следующую ошибку:

> source(file="C:\\Users\\Tony\\Desktop\\character_test.R", encoding = "UTF-8")
Error in source(file = "C:\\Users\\Tony\\Desktop\\character_test.R", encoding = "utf-8") : 
  C:\Users\Tony\Desktop\character_test.R:3:0: unexpected end of input
1: character.test <- function() print("R
2: 
  ^
In addition: Warning message:
In source(file = "C:\\Users\\Tony\\Desktop\\character_test.R", encoding = "UTF-8") :
  invalid input found on input connection 'C:\Users\Tony\Desktop\character_test.R'

Буду очень признателен за любую помощь, которую вы можете предложить, чтобы помочь мне понять, что здесь происходит.

> sessionInfo() # Windows 7 Pro x64
R version 2.12.1 (2010-12-16)
Platform: x86_64-pc-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United Kingdom.1252 
[2] LC_CTYPE=English_United Kingdom.1252   
[3] LC_MONETARY=English_United Kingdom.1252
[4] LC_NUMERIC=C                           
[5] LC_TIME=English_United Kingdom.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods  
[7] base     

loaded via a namespace (and not attached):
[1] tools_2.12.1

и

> l10n_info()
$MBCS
[1] FALSE

$`UTF-8`
[1] FALSE

$`Latin-1`
[1] TRUE

$codepage
[1] 1252

Ответы [ 7 ]

26 голосов
/ 08 апреля 2011

В R / Windows, source сталкивается с проблемами с любыми символами UTF-8, которые не могут быть представлены в текущей локали (или кодовой странице ANSI в Windows-говорящем). И, к сожалению, в Windows нет UTF-8, доступного как кодовая страница ANSI - у Windows есть техническое ограничение, согласно которому кодовые страницы ANSI могут быть только одно- или двухбайтовыми кодировками, а не кодированием переменных байтов, как UTF- 8.

Это не кажется фундаментальной, неразрешимой проблемой - просто что-то не так с функцией source. Вместо этого вы можете пройти 90% пути:

eval(parse(filename, encoding="UTF-8"))

Это будет работать почти так же, как source() с аргументами по умолчанию, но не позволит вам сделать echo = T, eval.print = T и т. Д.

24 голосов
/ 21 февраля 2011

Мы много говорили об этом в комментариях к моему предыдущему посту, но я не хочу, чтобы это потерялось на странице 3 комментариев: вы должны установить локаль, она работает с обоими входами из R-консоли ( см. скриншот в комментариях), а также с вводом из файла см. этот скриншот:

Файл "myfile.r" содержит:

russian <- function() print ("Американские с...");

Консоль содержит:

source("myfile.r", encoding="utf-8")
> Error in source(".....
Sys.setlocale("LC_CTYPE","ru")
> [1] "Russian_Russia.1251"
russian()
[1] "Американские с..."

Обратите внимание, что вход в файл завершается неудачно, и он указывает на тот же символ, что и ошибка исходного плаката (после «R»). Я не могу сделать это с китайским, потому что мне нужно будет установить «Microsoft Pinyin IME 3.0» но процесс тот же, вы просто заменяете локаль на "китайский" (наименование немного противоречиво, обратитесь к документации).

5 голосов
/ 27 сентября 2014

Для меня (на окнах) я делаю:

source.utf8 <- function(f) {
    l <- readLines(f, encoding="UTF-8")
    eval(parse(text=l),envir=.GlobalEnv)
}

Работает нормально.

5 голосов
/ 21 февраля 2011

Я думаю, что проблема связана с R. Я могу с радостью получить исходные файлы UTF-8 или UCS-2LE с большим количеством символов, отличных от ASCII. Но некоторые символы приводят к сбою. Например, следующее

danish <- function() print("Skønt H. C. Andersens barndomsomgivelser var meget fattige, blev de i hans rige fantasi solbeskinnede.")
croatian <- function() print("Dodigović. Kako se Vi zovete?")
new_testament <- function() print("Ne provizu al vi trezorojn sur la tero, kie tineo kaj rusto konsumas, kaj jie ŝtelistoj trafosas kaj ŝtelas; sed provizu al vi trezoron en la ĉielo")
russian <- function() print ("Американские суда находятся в международных водах. Япония выразила серьезное беспокойство советскими действиями.")

нормально как в UTF-8, так и в UCS-2LE без русской линии. Но если это включено, то это терпит неудачу. Я указываю пальцем на R. Ваш текст на китайском также кажется слишком сложным для R в Windows.

Язык здесь не имеет значения. Это просто файл, вы говорите ему, что такое кодировка файла, почему ваш язык должен иметь значение?

1 голос
/ 21 мая 2015

Я сталкиваюсь с этой проблемой, когда пытаюсь получить файл .R, содержащий несколько китайских символов. В моем случае я обнаружил, что просто установить «LC_CTYPE» на «китайский» недостаточно. Но установка "LC_ALL" на "китайский" работает хорошо.

Обратите внимание, что недостаточно правильно настроить кодировку при чтении или записи простого текстового файла в Rstudio (или R?) С не-ASCII. Настройка локали тоже имеет значение.

PS. команда Sys.setlocale (категория = "LC_CTYPE", локаль = "китайский"). Пожалуйста, замените значение языка соответственно.

1 голос
/ 21 февраля 2011

В Windows, когда вы копируете и вставляете строку в кодировке Unicode или utf-8 в текстовый элемент управления, для которого задан однобайтовый ввод (ascii ... в зависимости от локали), неизвестные байты будут заменены на вопросительные знаки. Если я возьму первые 4 символа вашей строки и скопирую их, например, в Блокнот, а затем сохранить его, файл становится в шестнадцатеричном виде:

52 3F 3F 3F 3F

что вам нужно сделать, это найти редактор, который вы можете установить в utf-8 перед копированием и вставкой в ​​него текста, тогда сохраненный файл (из ваших первых 4 символов) станет:

52 E5 90 8C E6 97 B6 E4 B9 9F E8 A2 AB

Это будет затем распознано как действительное utf-8 [R].

Я использовал «Notepad2» для этой попытки, но я уверен, что есть еще много.

0 голосов
/ 06 марта 2018

Опираясь на ответ вороны , это решение заставляет RStudio Source кнопку работать.

При нажатии этой кнопки Source, RStudio выполняет source('myfile.r', encoding = 'UTF-8')), поэтому переопределение source делает ошибки исчезающими и запускает код, как и ожидалось:

source <- function(f, encoding = 'UTF-8') {
    l <- readLines(f, encoding=encoding)
    eval(parse(text=l),envir=.GlobalEnv)
}
...