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

Utf8 в Perl и MySql

В моей базе данных (MySql) есть общая настройка utf8_general. Я получаю доступ к данным из базы данных и покажу веб-страницу (разработанную в Perl), она показывает шведских символов (ä, å, ö) с разными символами. Я проверил в базе данных Mysql, там я вижу данные с символами ä, å, ö. Кажется, есть проблема с кодированием при доступе к данным. При подключении к базе данных используется следующий код

my($dbh) = DBI->connect($config{'dbDriver'},$config{'dbUser'},$config{'dbPass'}) or die "Kunde inte ansluta till $config{'dataSource'}: " . $DBI::errstr;
$dbh->{'mysql_enable_utf8'} = 1;
$dbh->do('set names utf8');

Любая помощь будет воспринята!

Спасибо.

4b9b3361

Ответ 1

Если каждый символ /å/ö представляется на выходе двумя байтами, тогда также возможно, что вы можете дважды кодировать символы. (Учитывая, что вопрос уже показывает, что вы делаете $dbh->{'mysql_enable_utf8'} = 1;, я подозреваю, что это наиболее вероятный случай.) Другая возможность, учитывая, что вы показываете это на веб-странице, заключается в том, что на странице может не указываться, что кодировка является UTF-8 в своем <head>, и браузер может неправильно угадывать кодировку символов, которую он использует.

Внимательно посмотрите на свою инфраструктуру webapp, систему шаблонов и т.д., чтобы гарантировать, что значения кодируются только один раз, когда они извлекаются из базы данных и когда они попадают в пользовательский браузер. Многие механизмы каркаса/шаблонов (такие как комбинация Dancer и TT, которые я обычно использую) будут обрабатывать кодирование вывода автоматически, если вы их правильно настроите, а это значит, что данные будут дважды закодированы, если они явно закодированы до вывода.

Ответ 2

Вам нужно установить mysql_enable_utf8 при подключении:

 my($dbh) = DBI->connect(
     'dbi:mysql:test',
     'user',
     'password',
     {
         mysql_enable_utf8 => 1,
     }      
);

Ответ 3

Вам нужно установить Charset в utf8 в вашем соединении!

charset = utf8

Ответ 4

Вот полная спецификация:

http://search.cpan.org/~capttofu/DBD-mysql-4.038/lib/DBD/mysql.pm#mysql_enable_utf8

Кроме того, включение этого флага сообщает MySQL, что входящие данные должны обрабатываться как UTF-8. Это будет действовать только при использовании в качестве части вызова connect(). Если вы включите флаг после подключения, вам нужно будет выдать команду SET NAMES utf8, чтобы получить то же самое эффект.