readr :: read_csv проблема: китайский иероглиф превращается в беспорядочные коды

Я пытаюсь импортировать набор данных в RStudio, но я застрял с китайскими символами, поскольку они превращаются в беспорядочные коды. Вот код:

library(tidyverse)
df <- read_csv("中文,英文\n英文,德文")
df
# A tibble: 1 x 2
  `\xd6\xd0\xce\xc4`            `Ӣ\xce\xc4`
               <chr>                  <chr>
1 "<U+04E2>\xce\xc4" "<U+00B5>\xc2\xce\xc4"

Когда я использую базовую функцию read.csv, она работает хорошо. Думаю, я должен сделать что-то не так с кодировкой. Но в read_csv нет опции кодировки, как мне это сделать?


person X.Jun    schedule 29.10.2017    source источник
comment
Вы можете проверить здесь или здесь. В read_csv есть locale аргумент. Согласно документации locale The locale controls defaults that vary from place to place. The default locale is US-centric (like R), but you can use locale() to create your own locale that controls things like the default time zone, encoding, decimal mark, big mark, and day/month names.   -  person akrun    schedule 29.10.2017
comment
Также обратите внимание, readr может читать альтернативные кодировки через locale. Однако все функции чтения выдают строки, закодированные в UTF-8 в соответствии с документация по пакету   -  person Kevin Arseneau    schedule 29.10.2017
comment
Спасибо за комментарии! @Akrun @Kevin Arseneau Я попробовал то, что вы сказали. Но все равно не работает. Sys.setlocale(category="LC_ALL", locale = "English_United States.1252") read_csv("a,b\n坏,好") Sys.setlocale(category="LC_ALL", locale = "chinese") read_csv("a,b\n坏,好")   -  person X.Jun    schedule 29.10.2017


Ответы (1)


Это потому, что символы помечены как UTF-8, тогда как фактическая кодировка является системной по умолчанию (вы можете получить stringi::stri_enc_get()).

Итак, вы можете сделать либо:

1) Считайте данные с правильной кодировкой:

df <- read_csv("中文,英文\n英文,德文", locale = locale(encoding = stringi::stri_enc_get()))

2) Прочтите данные с неправильной кодировкой и пометьте их правильной кодировкой позже (обратите внимание, что это не всегда работает):

df <- read_csv("中文,英文\n英文,德文")
df <- dplyr::mutate_all(df, `Encoding<-`, value = "unknown")
person yutannihilation    schedule 29.10.2017
comment
Большое спасибо за ваше предложение! Работает очень хорошо! - person X.Jun; 31.10.2017