кодировка символов, dplyr с базой данных (postgresql)

Я читал потоки и обновления пакетов для проблем с кодировкой с Shiny, но у меня есть (трудно воспроизводимый пример) приложение Shiny, управляемое базой данных, которое возится с некоторыми специальными символами.

В моей базе данных postgresql я правильно вижу свою шведскую реку "Верхняя река Умеэльвен", которая, когда я отфильтрую ее обратно в интерфейс Shiny с помощью dplyr: names.rivers <- filter(tbl.rivers, Country == "Sweden") ...становится "Верхняя река Умеэльвен" Львенская река" в Р.

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

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

Еще раз извиняюсь за отсутствие примера, это ТОЛЬКО проблема извлечения из базы данных. Я подозреваю, что мне где-то не хватает флага на какой-то функции дезинфекции, но мне нужна помощь, чтобы указать правильное направление.


person Jeff    schedule 10.08.2016    source источник
comment
Вы подключаетесь к БД с помощью dplyr?   -  person Carl    schedule 10.08.2016
comment
Привет @Carl, да, подключение и фильтрация с помощью dplyr на кран. r-project.org/web/packages/dplyr/vignettes/databases.html.   -  person Jeff    schedule 10.08.2016
comment
Проблема появляется только с shiny или вы видите проблему каждый раз, когда запрашиваете БД с dplyr   -  person Carl    schedule 10.08.2016
comment
Только что протестировал как library(RPostgreSQL), так и library(DBI), и я получил тот же результат - не только в shiny, но и в R @Carl. Так что на самом деле это не проблема dplyr. Я до сих пор не могу найти объявление кодировки.   -  person Jeff    schedule 10.08.2016


Ответы (2)


В вашей кодовой странице 1252 Windows Latin 1 рендеринг для 'ä' в Upper Umeälven River соответствует кодовой точке 0xE4 (двоичный код 11100100).

Upper Umeälven River на той же кодовой странице имеет два октета 0xC3A4 (XXX00011 XX100100).

Однако, если принять во внимание правила кодирования UTF-8 кодовой точки, значащие биты точно такие же.

Где-то имеет место непреднамеренная или ошибочная кодировка символов, которая транспонирует символ в UTF-8, но по-прежнему считает, что строка имеет кодовую страницу Windows Latin 1.

Возможно, данные уже принимаются в кодировке UTF-8, и вы можете изменить кодовую страницу на кодовую страницу получения, чтобы отразить это. Где-то дальше может происходить безмолвная трансформация, и никаких указаний на это.

person Pekka    schedule 10.08.2016
comment
Спасибо @Pekka за ссылки - после непродолжительной паники (я читал установки postgresql, используемые по умолчанию для кодировки latin-1) я обнаружил, что, по крайней мере, в 9.4/9.5 мне повезло: ENCODING = 'UTF8' - person Jeff; 11.08.2016
comment
(Для всех, кто следит за этим, в pgAdmin панель SQL показывает язык определения данных для DROP или CREATE, который включает спецификацию кодировки.). Итак, я не буду тратить день на перестроение БД! Однако я не намного ближе к очистке своего интерфейса. Начинаю чувствовать, что упускаю что-то простое. - person Jeff; 11.08.2016

Как и предполагалось, ответ был прост: iconv(vector.to.convert, "UTF-8")

Мои "учения":

  1. Кодирование исходного файла, базы данных и потоков данных — это не одно и то же;
  2. Я потратил время на то, чтобы убедиться, что источники данных были созданы в правильной кодировке, игнорируя (неявное?) преобразование потока данных;
  3. Эта страница помогла: http://shiny.rstudio.com/articles/unicode.html

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

person Jeff    schedule 11.08.2016
comment
Привет, @Jeff, надеюсь, ты глубже погрузился в мир кодирования символов. У меня точно такая же ситуация, и iconv() тоже решает проблемы. Но я не совсем уверен, в чем проблема, ваш ответ не совсем понятен. Запуск iconv() для каждого столбца не кажется самым элегантным решением, поэтому я ищу способ решить общую проблему. - person Ratnanil; 25.11.2017
comment
Привет @Ratnanil - в нашем случае iconv() заполняет только один элемент управления и (относительно) небольшой набор результатов (обычно менее 100 значений); это было давно, но я не помню, чтобы копал глубже. Вы отправляете запросы postgresql на R? В базах данных R vis так много изменений, что, честно говоря, я предположил, что это ошибка интернационализации, и я удивлен, что она все еще возникает. Вы проверили, что он отображается с другими библиотеками? - person Jeff; 27.11.2017
comment
Нет, я еще не тестировал его с другими библиотеками, я попробую, когда у меня будет время. Я написал быструю функцию, выполняющую iconv все столбцы таблицы data.frame. Это делает рабочий процесс несколько приемлемым. - person Ratnanil; 29.11.2017