Помощь с многоязычным текстом, PHP и MySQL - PullRequest
0 голосов
/ 22 марта 2011

У меня не было конца проблем, пытаясь сделать то, что я думал, было бы относительно просто:

Мне нужна форма, которая может принимать пользовательский ввод текста на смеси английского и других языков, некоторые-байт (т.е. японский, корейский и т. д.), и это обрабатывается php и сохраняется (безопасно, избегая SQL-инъекций) в базе данных mysql.Он также должен быть доступен из базы данных, обрабатываться и использоваться на экране.

У меня настроен штраф для латинских символов, но когда я добавляю смесь латинских и многобайтовых символов, он искажается.

Я пытался сделать домашнее задание, но сейчас бьюсь головой о стену.

Магические кавычки отключены, я пытался использовать utf8_encode / decode, htmlentities, addlashes / stripslashes и (в mysql) и «utf8_general_ci», и «utf8_unicode_ci» для поля в таблице.

Отчасти проблема в том, что есть так много мест, где я могу все испортить, что я не уверен, гденачать решение проблемы.

Большое спасибо всем за помощь в этом.В идеале, если кто-то имеет рабочие примеры кода php и / или знает правильный формат таблицы mysql, это было бы замечательно.

Ответы [ 6 ]

2 голосов
/ 22 марта 2011

Вот список вещей, которые нужно проверить в режиме UTF8:

  • MySQL таблица кодирования. Вы, кажется, уже сделали это.
  • Кодировка соединения MySQL. Сделайте SHOW STATUS LIKE 'char%', и вы увидите, что использует MySQL. Вам необходимо character_set_client, character_set_connection и character_set_results установить значение utf8, которое можно легко установить в вашем приложении, выполнив SET NAMES 'utf8' в начале всех подключений. Это тот, который большинство людей забывают проверить, IME.
  • Если вы используете их, ваш CLI и настройки терминала. В bash это означает LANG=(something).UTF-8.
  • Ваш исходный код (обычно это не проблема, если у вас нет постоянного текста UTF8).
  • Кодировка страницы. Похоже, вы тоже правы, но инструменты отладки в вашем браузере могут сильно помочь.

Как только вы все это сделаете правильно, все, что вам понадобится в вашем приложении, это mysql_real_escape_string().

Да, и - это (к сожалению) возможность успешно сохранить правильно закодированный текст UTf8 в столбце с неправильным типом кодировки или из соединения с неправильным типом кодировки. И это может вернуться "правильно", тоже. Пока вы не исправите все биты, которые не являются UTF8, в этот момент он ломается.

0 голосов
/ 22 марта 2011

Проблема была вызвана тем, что в файле php.ini не было задано значение char по умолчанию и (возможно) не было задано значение char в таблице mysql (в PhpMyAdmin через вкладку Operations).

Установка значения по умолчанию, установленного в "utf-8", исправила это.Спасибо за помощь !!

0 голосов
/ 22 марта 2011

Проверьте настройки подключения к базе данных. Также необходимо поддерживать UTF-8.

0 голосов
/ 22 марта 2011

Случайно ли вы сериализуете какие-либо данные?Функция сериализации PHP имеет некоторые проблемы при сериализации неанглийских символов.

Все, что вы делаете, должно быть в кодировке utf-8 .

Одна вещь, которую вы можете попробовать, - json_encode () данные при помещении их в базу данных и json_decoding () при получении.

0 голосов
/ 22 марта 2011

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

0 голосов
/ 22 марта 2011

Не думаю, что у вас есть практические альтернативы UTF-8.Вам нужно будет отследить, где нарушается кодирование и / или декодирование.Начните с проверки, можете ли вы отправлять многоязычный текст в базу данных из командной строки mysql или, возможно, через phpmyadmin.Отследить и устранить проблемы на этом уровне.Затем продвиньтесь еще на один уровень, имитируя ввод в ваш php и изучая вывод, снова решая любые проблемы.Наконец добавьте в микс браузеры.

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