UTF-8 на всех уровнях!
Я настраиваю новый сервер и хочу полностью поддерживать UTF-8 в своем веб-приложении. В прошлом, когда я пробовал это на существующих серверах, мне всегда приходилось возвращаться к ISO-8859-1.
Где именно мне нужно установить кодировку/символьные наборы? Я знаю, что необходимо настроить Apache, MySQL и PHP для этого — существует ли какой-то стандартный чек-лист, которому я могу следовать, или, возможно, способы устранения несоответствий, которые могут возникнуть?
Это для нового сервера на Linux, с установленными MySQL 5, PHP 5 и Apache 2.
3 ответ(ов)
В вашем случае вы использовали функцию mb_split
, которая работает с регулярными выражениями. Поэтому мне также пришлось вручную убедиться, что кодировка регулярных выражений установлена в UTF-8, для чего я выполнил команду mb_regex_encoding('UTF-8');
.
Дополнительно, запустив mb_internal_encoding()
, я выяснил, что внутренняя кодировка не была установленная на UTF-8, и изменил это, выполнив mb_internal_encoding("UTF-8");
.
Проблема, с которой вы столкнулись, может возникать из-за того, что функция strtolower()
не корректно обрабатывает строки с многобайтовыми символами, например, когда в строке присутствуют специальные символы или символы из других языков. Это может приводить к обрезанию данных.
Чтобы избежать таких проблем, рекомендуется использовать функцию mb_strtolower()
, которая предназначена для работы с многобайтовыми строками. Пример её использования:
mb_strtolower($string, 'UTF-8');
Библиотека mb_
(MultiByte) поддерживает большее количество символов и корректно обрабатывает строки, содержащие специальные символы, однако стоит отметить, что она может работать немного медленнее по сравнению с strtolower()
. Это компромисс, который стоит учесть, если ваша работа связана с интернационализацией или если вы обрабатываете текст на нескольких языках.
Если вы хотите, чтобы сервер MySQL определял кодировку, а не PHP в качестве клиента (старое поведение, которое, на мой взгляд, предпочтительно), попробуйте добавить skip-character-set-client-handshake
в ваш файл my.cnf
под секцией [mysqld]
, а затем перезапустите MySQL.
Обратите внимание, что это может вызвать проблемы, если вы используете что-то, кроме UTF-8.
Почему не стоит использовать функции mysql_* в PHP?
Как предотвратить SQL-инъекции в PHP?
Ошибка: mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows и др. ожидают ресурс в качестве параметра 1
Какой лучший порядок сортировки использовать для MySQL с PHP? [закрыто]
SQL-инъекция, обхватывающая mysql_real_escape_string()