UTF-8 полностью - PullRequest
       103

UTF-8 полностью

1105 голосов
/ 11 ноября 2008

Я настраиваю новый сервер и хочу полностью поддерживать UTF-8 в моем веб-приложении. Я пытался сделать это в прошлом на существующих серверах, и мне всегда приходилось прибегать к ISO-8859-1.

Где именно мне нужно установить кодировку / кодировки? Я знаю, что для этого мне нужно настроить Apache, MySQL и PHP - есть ли какой-нибудь стандартный контрольный список, которому я могу следовать, или, возможно, устранить неполадки в случае несоответствия?

Это для нового сервера Linux, работающего под управлением MySQL 5, PHP, 5 и Apache 2.

Ответы [ 14 ]

6 голосов
/ 11 ноября 2008

Поддержка Unicode в PHP по-прежнему огромная путаница. Хотя он способен конвертировать строку ISO8859 (которую он использует внутри) в utf8, ему не хватает возможности работать со строками Unicode изначально, что означает, что все функции обработки строк будут искажать и портить ваши строки. Поэтому вам нужно либо использовать отдельную библиотеку для правильной поддержки utf8, либо переписать все функции обработки строк самостоятельно.

Простая часть - просто указать кодировку в заголовках HTTP и в базе данных и тому подобное, но ничего из этого не имеет значения, если ваш код PHP не выводит допустимый UTF8. Это сложная часть, и PHP там практически не помогает. (Я думаю, что PHP6 должен исправить худшее из этого, но это еще далеко)

5 голосов
/ 12 февраля 2015

Если вы хотите, чтобы сервер MySQL определял набор символов, а не PHP как клиент (старое поведение; предпочтительнее, на мой взгляд), попробуйте добавить skip-character-set-client-handshake к вашему my.cnf в [mysqld] и перезапустить mysql.

Это может вызвать проблемы, если вы используете что-то кроме UTF8.

5 голосов
/ 14 января 2011

Отличный ответ. Вот что мне нужно было сделать на обычной установке debian / php / mysql:

// storage
// debian. apparently already utf-8

// retrieval
// the mysql database was stored in utf-8, 
// but apparently php was requesting iso. this worked: 
// ***notice "utf8", without dash, this is a mysql encoding***
mysql_set_charset('utf8');

// delivery
// php.ini did not have a default charset, 
// (it was commented out, shared host) and
// no http encoding was specified in the apache headers.
// this made apache send out a utf-8 header
// (and perhaps made php actually send out utf-8)
// ***notice "utf-8", with dash, this is a php encoding***
ini_set('default_charset','utf-8');

// submission
// this worked in all major browsers once apache
// was sending out the utf-8 header. i didnt add
// the accept-charset attribute.

// processing
// changed a few commands in php, like substr,
// to mb_substr

это было все!

0 голосов
/ 24 марта 2019

Если вы хотите решение MySQL, у меня были аналогичные проблемы с 2 из моих проектов, после миграции сервера. После поиска и опробования множества решений я наткнулся на это / ничего до того, как это сработало):

mysqli_set_charset($con,"utf8");

После добавления этой строки в мой конфигурационный файл все работает отлично!

Я нашел это решение https://www.w3schools.com/PHP/func_mysqli_set_charset.asp, когда искал решение для вставки из HTML-запроса

удачи!

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