По некоторым запутанным причинам, которые лучше оставить в прошлом, мне нужен прямой доступ к содержимому базы данных WordPress. Я использую MySQL 5.0.70-r1 на Gentoo с WordPress 2.6 и Perl 5.8.8 ftr.

Итак, иногда мы получаем символы высокого порядка в блоге, у нас также есть немало авторов, которые по большей части попадают в базу данных WordPress в wp_posts.post_content или wp_postmeta.meta_value, Wordpress отображает их правильно на своем сайте, но база данных хранит его с использованием однобайтовой кодировки, которую я не могу понять, как преобразовать в правильную строку. Сегодняшний пример:

Блог показывает это, и даже не кажется, что в HTML нет никаких символов,

   Hãhãhães  

Но база данных, просматриваемая через приглашение MySQL, имеет,

   Hãhãhães

Итак, очевидно, что это какая-то проблема с двухбайтовой кодировкой, но я не знаю, как ее исправить. Мне нужно получить эту вторую строку из базы данных (потому что это то, что она мне дает) и преобразовать в первую, и мне нужно сделать это с помощью Perl.

Кроме того, чтобы очистить от грязи воду, я взял эти строки и распечатал коды ASCII для каждого символа, используя функцию Perl ord().

Вот результат «неправильной» строки:

H = 72
à = 195
£ = 163
h = 104
à = 195
£ = 163
h = 104
à = 195
£ = 163
e = 101
s = 115

Это правильная строка, которую мне нужно создать в моем скрипте:

H = 72
ã = 227
h = 104
ã = 227
h = 104
ã = 227
e = 101
s = 115
0
qbxk 29 Мар 2010 в 02:05

2 ответа

Лучший ответ

Исправил ... Спасибо тем, кто читал и / или пробовал.

my $dbh = DBI->connect('mysql:etc:etc');
$dbh->{mysql_enable_utf8}++;  #<---- solution

Вот и все, вздох ...

Не уверен насчет подсказки MySQL, потому что мне все равно, но я уверен, что это аналогичное решение, чтобы убедиться, что MySQL возвращает результаты в двухбайтах в свое приглашение. Хотя см. Мой комментарий выше, переменные "set character_set_ *", похоже, не повлияли на это.

1
Peter Mortensen 29 Мар 2010 в 13:17

Как насчет SET NAMES 'utf8'?

1
jholster 29 Мар 2010 в 12:32
"SET NAMES указывает, какой набор символов клиент будет использовать для отправки операторов SQL на сервер" // ммм .. я не отправляю sql на сервер ... моя проблема в данных, которые возвращает сервер, и как это сделать перекодируйте его // также из документации mysql по именам наборов я обнаружил character_set_results, character_set_client, хотя установка их на 'utf8', похоже, не влияет на запрос выбора для создания плохо закодированной строки выше. Я также пробовал просто "charset utf8;" что тоже, казалось, не имело никакого эффекта
 – 
qbxk
29 Мар 2010 в 02:34
Может быть проблема с вашим терминалом? (Предполагая, что вы его используете.)
 – 
jholster
29 Мар 2010 в 02:49
Нет, проблема не в терминале, это отвлекающий маневр. проблема в том, что я не знаю, как преобразовать эту строку с однобайтовой кодировкой в ​​правильную строку с двухбайтовой кодировкой.
 – 
qbxk
29 Мар 2010 в 05:43
Исправлен синтаксис UTF-8 → 'utf8'. Это может дать вам несколько идей: phpwact.org/php/i18n/utf-8 / mysql
 – 
jholster
29 Мар 2010 в 12:34