PHP / MySQL с проблемами кодирования - PullRequest
5 голосов
/ 02 января 2009

У меня проблема с кодировкой PHP.

У меня есть страница JavaScript / jQuery HTML5, взаимодействующая с моим PHP-скриптом с использованием $ .post. Однако PHP сталкивается со странной проблемой, вероятно, связанной с кодированием.

Когда я пишу

htmlentities("í")

Я ожидаю, что PHP выведет í. Однако вместо этого он выдает í Вначале я думал, что ошибаюсь с кодировками, однако

htmlentities("í")=="í"?"Good":"Fail";

выводит «Fail», где

htmlentities("í")=="í"?"Good":"Fail";

Но htmlentities($search, null, "utf-8") работает как положено.

Я хочу, чтобы PHP общался с сервером MySQL, но у него тоже есть проблемы с кодировкой, даже если я использую utf8_encode. Что мне делать?

РЕДАКТИРОВАТЬ: В команде SQL, написание

SELECT id,uid,type,value FROM users,profile
WHERE uid=id AND type='name' AND value='XXX';

, где XXX не содержит символов í, работает как положено, но не работает, если есть символ 'í'.

SET NAMES 'utf8';
SET CHARACTER SET 'utf8';
SELECT id,uid,type,value FROM users,profile
WHERE uid=id AND type='name' AND value='XXX';

Не только сбой для символов, но также сбой для строк без каких-либо «специальных» символов. Удаление символов 'из SET NAMES и SET CHARACTER SET, похоже, ничего не меняет.

Я подключаюсь к базе данных MySQL, используя PDO.

РЕДАКТИРОВАТЬ 2: Я использую MySQL версии 5.1.30 XAMPP для Linux.

РЕДАКТИРОВАТЬ 3: Запуск SHOW VARIABLES LIKE '%character%' с выходов PhpMyAdmin

character_set_client    utf8
character_set_connection    utf8
character_set_database  latin1
character_set_filesystem    binary
character_set_results   utf8
character_set_server    latin1
character_set_system    utf8
character_sets_dir  /opt/lampp/share/mysql/charsets/

Выполнение того же запроса из моего PHP-скрипта (с print_r) выводит:

Array
(
    [0] => Array
        (
            [Variable_name] => character_set_client
            [0] => character_set_client
            [Value] => latin1
            [1] => latin1
        )

    [1] => Array
        (
            [Variable_name] => character_set_connection
            [0] => character_set_connection
            [Value] => latin1
            [1] => latin1
        )

    [2] => Array
        (
            [Variable_name] => character_set_database
            [0] => character_set_database
            [Value] => latin1
            [1] => latin1
        )

    [3] => Array
        (
            [Variable_name] => character_set_filesystem
            [0] => character_set_filesystem
            [Value] => binary
            [1] => binary
        )

    [4] => Array
        (
            [Variable_name] => character_set_results
            [0] => character_set_results
            [Value] => latin1
            [1] => latin1
        )

    [5] => Array
        (
            [Variable_name] => character_set_server
            [0] => character_set_server
            [Value] => latin1
            [1] => latin1
        )

    [6] => Array
        (
            [Variable_name] => character_set_system
            [0] => character_set_system
            [Value] => utf8
            [1] => utf8
        )

    [7] => Array
        (
            [Variable_name] => character_sets_dir
            [0] => character_sets_dir
            [Value] => /opt/lampp/share/mysql/charsets/
            [1] => /opt/lampp/share/mysql/charsets/
        )

)

Запуск

SET NAMES 'utf8';
SET CHARACTER SET 'utf8';
SHOW VARIABLES LIKE '%character%'

выводит пустой массив.

Ответы [ 3 ]

18 голосов
/ 02 января 2009

Очень важно указать кодировку htmlentities , чтобы она соответствовала кодировке ввода, как вы делали в последнем примере, но не указали в первых трех.

htmlentities($text,ENT_COMPAT,'utf-8');

Что касается связи с MySQL, вам необходимо убедиться, что сопоставление соединений и набор символов совпадают с данными, которые вы передаете. Вы можете установить это в файле конфигурации или во время выполнения, используя следующие запросы:

SET NAMES utf8;
SET CHARACTER SET utf8;

Убедитесь, что наборы символов таблицы, базы данных и сервера также совпадают. Есть один параметр, который вы не можете изменить во время выполнения, и это набор символов сервера. Вам необходимо изменить его в файле конфигурации:

[mysqld]
character-set-server = utf8
default-character-set = utf8 
skip-character-set-client-handshake

Подробнее о наборах символов и сопоставлениях в MySQL см. В руководстве .

7 голосов
/ 23 августа 2011

Позднее возрождение. Но для дальнейшего ознакомления вот несколько дополнительных советов:

  1. Используйте mysql_set_charset вместо SET xxx
  2. Убедитесь, что вы сохраняете файл в кодировке UTF-8 (об этом часто забывают)
  3. Установить заголовки:
    <?php header("Content-type: text/html; charset=utf-8"); ?>

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

  4. Если ваша конфигурация сервера Apache содержит директиву AddDefaultCharset с другой кодировкой, обратитесь к администратору хоста.
1 голос
/ 14 декабря 2012

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

В моем случае это было несоответствие с сервером charset / collation. Все остальное было установлено в utf8, кроме серверной кодировки, в которой был latin1. Это привело к тому, что все данные utf8, введенные в базу данных, отображались в необработанном кодированном виде, например, L = A с тильдой ~ ...

Я использую mysqli, и чтобы исправить это, я использовал метод, описанный выше Энтони Аксиоли ​​(используя mysql_set_charset). У этого метода есть версия mysqli , и это то, что я использовал.

После этого я был озадачен. У меня все еще был беспорядок при просмотре моего сайта. Конечно, я не знал, что, изменив значение latin1 на utf8, я также испортил бы кодирование / декодирование символов всего этого. Поэтому я воспользовался помощью онлайнового кодировщика / декодера строк , чтобы исправить данные таблицы.

Я сделал различные экспорты всех моих данных контента (вы можете настроить их для получения запросов на обновление, и это будет быстрее для вашего процесса обновления), и провел вывод sql через вышеупомянутый онлайн-кодировщик / декодер, затем скопировал и вставил исправлены запросы на панели phpmyadmin sql ... таким образом исправлены мои ошибки кодирования. Теперь все так, как должно быть, и я снова могу обрабатывать поиски с потерями: Мария, Мария, Мария, Мария все будут соответствовать Марии, Марии, Марии и т. Д. Все острые персонажи оценивают по своему базовому гласному характеру. Эпическая победа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...