Подтвердить что ты не робот

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

Я пытаюсь импортировать 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 без импорта файла спецификации:

> 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
4b9b3361

Ответ 1

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

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 и иностранного языка

Ответ 2

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

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 и сделать тестовый файл в блокноте ++ с линией латинского и линией кириллицы.

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
ŠŠøŠ½ŠµŠ¼ŃŠ¼ ŠŗŠ¾Š½ŠŗŃ‹ŠæŃ‚Š°Š¼ тхѨŠ¾ŠæŃ…Ń€Š°Š¶Ń‚ŃŠ

Тем не менее, script не дает доступа к нему.

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

Результаты для No BOM UTF-8 выглядят примерно так, как для представления (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 Предупреждения, о которых вы говорили, по-прежнему остаются без видимых важных эффектов.

Ответ 3

Существует два варианта чтения данных из файлов, содержащих символы, не поддерживаемые вашей текущей локалью. Вы можете изменить свой язык, как предлагается @user23676, или вы можете конвертировать в UTF-8. Пакет 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/

Ответ 4

Согласно Wikipedia:

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

В любом случае в мире Windows UTF8 используется с спецификацией. Например, стандартный редактор Notepad использует спецификацию при сохранении как 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)

Ответ 5

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

Моя ситуация - запись результатов 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, выглядит следующим образом:

результат перевода, как показано в среде R

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

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

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

результат перевода, как показано в среде R

Мое решение - взято из ответов выше:

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

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

> Sys.setlocale(locale = "Chinese") # set locale to Chinese
[1] "LC_COLLATE=Chinese (Simplified)_People Republic of China.936;LC_CTYPE=Chinese (Simplified)_People Republic of China.936;LC_MONETARY=Chinese (Simplified)_People Republic of China.936;LC_NUMERIC=C;LC_TIME=Chinese (Simplified)_People 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 был:

правильно визуализированный перевод в среде R

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

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

правильно визуализированный и записанный файл, как видно из 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:

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