Проблема извлечения кодировки таблицы базы данных R - PullRequest
0 голосов
/ 03 января 2019

У меня есть база данных MySQL, содержащая таблицу имен. Как только я помещаю их в R, я сталкиваюсь с некоторыми проблемами кодирования, которые я не понимаю, но, похоже, все они связаны с тем, как R интерпретировал файл.

con <- dbConnect(MySQL(),
                 host = 'localhost',
                 user = 'root',
                 dbname='test',
                 rstudioapi::askForPassword('Database password')
)

и извлеките таблицу names из моей базы данных MySQL с помощью

df <- dbReadTable(con, 'names')

Мой стол выглядит примерно так

df <- structure(list(id = c(373863, 17731249), name = c("AARESTRUP, JAN CARO̸E", 
"BÃœTTNER, CHRISTIAN")), .Names = c("id", "name"), class = "data.frame", row.names = c(NA, 
-2L))


df
        id                   name
1   373863 AARESTRUP, JAN CARO̸E
2 17731249    BÃœTTNER, CHRISTIAN

Проверка кодировки приносит

Encoding(df$name)
[1] "unknown" "unknown"

Использование Encoding(df$name) <- "UTF-8" исправляет второе имя, но превращает части имени 1 в символ, отличный от UTF-8.

df
        id                         name
1   373863 AARESTRUP, JAN CARO<U+0338>E
2 17731249           BÜTTNER, CHRISTIAN

Теперь становится странно, когда df$name[1] возвращается [1] "AARESTRUP, JAN CARO̸E" именно так он и хранится в базе данных MySQL, в то время как кажется, что он интерпретируется по-разному, когда я называю целое df.

Во-первых, есть ли способ обеспечить автоматическое считывание dbReadTable() UTF-8. Я нашел ссылку , которая, похоже, ничего не меняет с точки зрения моей кодировки таблицы.

Во-вторых, что происходит с разницей в интерпретации кодировки, отличной от UTF-8, в зависимости от того, как вы получаете доступ к имени (весь df против одного элемента)

1 Ответ

0 голосов
/ 03 января 2019

<U+0338> - это символ UTF-8 .Но это оверлейный символ, который при рендеринге занимает то же пространство, что и предшествующий ему символ O.По какой-то причине он отображает его неправильно (хотя я проверил и в R он отображается правильно, поэтому, похоже, это связано со StackOverflow или, возможно, с Firefox).Вы можете использовать

apply(df, MARGIN = 2, FUN = function(x) if( typeof(x) == 'character' ) Encoding(x)<-'UTF-8')

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

Я думаю, что разница в поведении междувы вызываете df$name[1], а когда вы вызываете df, это связано с различными методами print / show для объектов символьного типа и data.frames.

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

Метод show для объектов символьного типа хочет визуализировать символы для вас (большую часть времени).

...