R в Windows: кодировка символов hell

Я пытаюсь импортировать CSV, закодированный как OEM-866 (кириллическая кодировка) в R в Windows. У меня также есть копия, которая была преобразована в UTF-8 без спецификации. Оба этих файла читаются всеми другими приложениями в моей системе, как только кодировка указана.

кроме того, в Linux, R может читать эти файлы с указанными кодировками нормально. Я также могу прочитать CSV в Windows, если не указать параметр "fileEncoding", но это приводит к нечитаемым текст. Когда я указываю кодировку файла в Windows, я всегда получаю следующие ошибки, как для OEM, так и для файла Unicode:

оригинальный OEM импортируйте файл:

> oem.csv <- read.table("~/csv1.csv", sep=";", dec=",", quote="",fileEncoding="cp866")   #result:  failure to import all rows
Warning messages:
1: In scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  :
  invalid input found on input connection '~/Revolution/RProject1/csv1.csv'
2: In scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  :
  number of items read is not a multiple of the number of columns

UTF-8 без импорта файлов BOM:

> unicode.csv <- read.table("~/csv1a.csv", sep=";", dec=",", quote="",fileEncoding="UTF-8") #result:    failure to import all row
Warning messages:
1: In scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  :
  invalid input found on input connection '~/Revolution/RProject1/csv1a.csv'
2: In scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  :
  number of items read is not a multiple of the number of columns

информация о локали:

> Sys.getlocale()
   [1] "LC_COLLATE=English_United States.1252;LC_CTYPE=English_United States.1252;LC_MONETARY=English_United States.1252;LC_NUMERIC=C;LC_TIME=English_United States.1252"

что это о R на Windows, которая несет ответственность за это? К этому моменту я почти все перепробовал, кроме как выбрасывать окна.

Спасибо

(дополнительный не попытки):

>Sys.setlocale("LC_ALL", "en_US.UTF-8") #OS reports request to set locale to "en_US.UTF-8" cannot be honored
>options(encoding="UTF-8") #now nothing can be imported  
> noarg.unicode.csv <- read.table("~/Revolution/RProject1/csv1a.csv", sep=";", dec=",", quote="")   #result: mangled cyrillic
> encarg.unicode.csv <- read.table("~/Revolution/RProject1/csv1a.csv", sep=";", dec=",", quote="",encoding="UTF-8") #result: mangled cyrillic

5 ответов


возможно, что ваша проблема решена путем изменения fileEncoding в кодировку, эти параметры работают по-разному в функции read (см. ?читать.)

oem.csv <- read.table("~/csv1.csv", sep=";", dec=",", quote="",encoding="cp866")

на всякий случай, однако, более полный ответ, так как там могут быть некоторые неочевидные препятствия. Короче говоря: можно работать с кириллицей в R на Windows (в моем случае Win 7).

вам может потребоваться попробовать несколько возможных кодировок, чтобы заставить вещи работать. Для анализа текста, важным аспектом является получение ваши входные переменные соответствуют данным. Там функция Encoding () очень полезна, см. Также iconv (). Таким образом, можно увидеть свой собственный параметр.

Encoding(variant <- "Минемум")

в моем случае кодировка UTF-8, хотя это может зависеть от системных настроек. Итак, мы можем попробовать результат с UTF-8 и UTF-8-BOM и сделать тестовый файл в notepad++ со строкой латинского и строкой кириллицы.

UTF8_nobom_cyrillic.csv & UTF8_bom_cyrillic.csv

part2, part3, part4
Минемум конкыптам, тхэопхражтуз, ед про

это может быть импортировать в R по

raw_table1 <- read.csv("UTF8_nobom_cyrillic.csv", header = FALSE, sep = ",", quote = "\"", dec = ".", fill = TRUE, comment.char = "", encoding = "UTF-8")
raw_table2 <- read.csv("UTF8_bom_cyrillic.csv", header = FALSE, sep = ",", quote = "\"", dec = ".", fill = TRUE, comment.char = "", encoding = "UTF-8-BOM")

результаты этих Для меня для BOM регулярной кириллицы в представлении (raw_table1) и тарабарщины в консоли.

part2, part3, part4
ŠŠøŠ½ŠµŠ¼ŃŠ¼ ŠŗŠ¾Š½ŠŗŃ‹ŠæŃ‚Š°Š¼ тхѨŠ¾ŠæŃ…Ń€Š°Š¶Ń‚ŃŠ

что еще более важно, однако, скрипт не дает к нему доступа.

> grep("Минемум", as.character(raw_table2[2,1]))
integer(0)

результаты для No BOM UTF-8, что-то вроде этого для обоих view(raw_table1) и консоли.

part2, part3, part4
<U+041C><U+0438><U+043D><U+0435><U+043C><U+0443><U+043C> <U+043A><U+043E><U+043D><U+043A><U+044B><U+043F><U+0442><U+0430><U+043C> <U+0442><U+0445><U+044D><U+043E><U+043F><U+0445><U+0440><U+0430><U+0436><U+0442><U+0443><U+0437> <U+0435><U+0434> <U+043F><U+0440><U+043E>

однако, что важно, поиск слова внутри даст правильный результат.

> grep("Минемум", as.character(raw_table1[2,1]))
1

таким образом, можно работать с нестандартными символами в Windows, в зависимости от ваших точных целей. Я регулярно работаю с неанглийскими латинскими символами, а UTF-8 позволяет работать в Windows 7 без проблем. "WINDOWS-1252" был полезен для экспорта в читателей Microsoft, таких как Excel.

PS здесь сгенерированы русские слова http://generator.lorem-ipsum.info/_russian, так по существу бессмысленно. PPS предупреждения, которые вы упомянули, остаются без видимых важных последствий.


простой ответ.

Sys.setlocale(locale = "Russian")

если вы просто хотите русский язык (не форматы, валюты):

'Sys.setlocale(category = "LC_COLLATE", locale = "Russian")'

'Sys.setlocale(category = "LC_CTYPE", locale = "Russian")'

если вы используете Revolution R Open 3.2.2, вам также может потребоваться установить языковой стандарт на панели управления: в противном случае - если у вас есть RStudio - вы увидите кириллический текст в средстве просмотра и мусор в консоли. Например, если вы наберете случайную кириллическую строку и нажмете enter, вы получите мусор выход. Интересно, что Revolution R не имеет такой же проблемы с арабским текстом. Если вы используете обычный R, кажется, что Sys.setlocale() достаточно.

'Sys.функции setlocale()' был предложен г. пользователей Гротендика здесь: R, Windows и символы иностранного языка


существует два варианта чтения данных из файлов, содержащих символы, не поддерживаемые текущей локали. Вы можете изменить свою локаль, как предложено @user23676, или вы можете преобразовать в UTF-8. The readr пакет обеспечивает замену для read.table производные функции, которые выполняют это преобразование для вас. Вы можете прочитать файл в CP866

library(readr)
oem.csv <- read_csv2('~/csv1.csv', locale = locale(encoding = 'CP866'))

есть одна маленькая проблема, которая заключается в том, что есть ошибка в print.data.frame что результаты в Столбцах с UTF-8 кодировки некорректно отображаются в Windows. Вы можете обойти ошибку с помощью print.listof(oem.csv) или print(as.matrix(oem.csv)).

Я обсудил это более подробно в блоге на http://people.fas.harvard.edu/~izahn/posts/reading-data-with-non-native-encoding-in-r/


по данным Википедия:

Знак порядка байтов (BOM) - это символ Юникода, используемый для сигнализации endianness (порядка байтов) [...] Стандарт Unicode разрешает спецификацию в UTF-8, но не требует и не рекомендует ее использование.

в любом случае в мире Windows UTF8 используется с BOM. Например, стандартный редактор Блокнота использует спецификацию при сохранении как UTF-8.

многие приложения, рожденные в мире Linux (включая LaTex, например, при использовании inputenc пакета с utf8) показать проблемы при чтении файлов BOM-UTF-8.

Notepad++ - это типичная опция для преобразования из типов кодирования, окончаний строк Linux/DOS/Mac и удаления спецификации.

как мы знаем, что не рекомендуемое представление UTF-8 спецификации-это последовательность байтов

0xEF,0xBB,0xBF

в начале текстового потока, почему бы не удалить его с самим R?

## Converts an UTF8 BOM file as a NO BOM file
## ------------------------------------------

## Usage:
## Set the variable BOMFILE (file to convert) and execute

BOMFILE="C:/path/to/BOM-file.csv"


conr= file(BOMFILE,  "rb")
if(readChar(conr, 3, useBytes = TRUE)== ""){
    cat("The file appears UTF8-BOM. Converting as NO BOM.\n\n") 
    BOMFILE=sub("(\.\w*$)", "-NOBOM\1", BOMFILE)
    BOMFILE=paste0( getwd(), '/', basename (BOMFILE))

    if(file.exists(BOMFILE)){
        cat(paste0('File:\n', BOMFILE, '\nalready exists. Please rename.\n' ))  
    } else{

    conw= file(BOMFILE,  "wb")
        while(length( x<-readBin(conr, "raw", n=100)) !=0){
            cat (rawToChar (x))
            writeBin(x, conw)  
    }
    cat(paste0('\n\nFile was converted as:\n', getwd(), BOMFILE, '\n' ))    
    close(conw) 
    }
}else{
    BOMFILE=paste0( getwd(), '/', basename (BOMFILE))
    cat(paste0('File:\n', BOMFILE, '\ndoes not appear UTF8 BOM.\n' ))   

}
close(conr)

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

моя ситуация-запись результатов API Google Translate в файл в R

для моей конкретной цели я отправлял текст в Google API:

   # load library
   library(translateR)

   # return chinese tranlation
   result_chinese <- translate(content.vec = "This is my Text",
                            google.api.key = api_key, 
                            source.lang = "en",
                            target.lang = "zh-CN")

результат я вижу в R Environment вот так:

result of translation as seen in the R Environment

однако, если я напечатаю свою переменную в консоли, я увижу этот красиво отформатированный (я надеюсь) текст:

> print(result_chinese)
[1] "这是我的文字"

в моей ситуации мне пришлось записать файл в компьютерную файловую систему с помощью функции R write.table()... но все, что я бы написал, Было бы в формате:

result of translation as seen in the R Environment

мое решение-взятые сверху ответы:

я решил на самом деле использовать функцию Sys.setlocale() такой:

Sys.setlocale(locale = "Chinese") # set locale to Chinese

> Sys.setlocale(locale = "Chinese") # set locale to Chinese
[1] "LC_COLLATE=Chinese (Simplified)_People's Republic of China.936;LC_CTYPE=Chinese (Simplified)_People's Republic of China.936;LC_MONETARY=Chinese (Simplified)_People's Republic of China.936;LC_NUMERIC=C;LC_TIME=Chinese (Simplified)_People's Republic of China.936"

после этого мой перевод был правильно визуализирован в среде R:

# return chinese tranlation with new locale 
result_chinese <- translate(content.vec = "This is my Text",
                            google.api.key = api_key, 
                            source.lang = "en",
                            target.lang = "zh-CN")

результат в среде R был:

properly visualized translation in R Environment

после этого я мог написать свой файл и, наконец, увидеть китайский текст:

# writing 
write.table(result_chinese, "translation.txt")

properly visualised and written file as seen from Notepad++

наконец, в моей функции перевода я бы вернулся к своим исходным настройкам с:

Sys.setlocale() # to set up current locale to be default of the system

> Sys.setlocale() # to set up current locale to be default of the system
[1] "LC_COLLATE=English_United Kingdom.1252;LC_CTYPE=English_United Kingdom.1252;LC_MONETARY=English_United Kingdom.1252;LC_NUMERIC=C;LC_TIME=English_United Kingdom.1252"

мои выводы:

прежде чем иметь дело с конкретными языками в R:

  1. настройка языкового стандарта на один из определенного языка Sys.setlocale(locale = "Chinese") # set locale to Chinese
  2. выполнить все манипуляции с данными
  3. возврат к исходным настройкам Sys.setlocale() # set original system settings