Символы UTF-8 отображаются неправильно

Это мой PHP-код:

<?php $result = ''; $str = 'Тугайный соловей'; for ($y=0; $y < strlen($str); $y++) { $tmp = mb_substr($str, $y, 1); $result = $result . $tmp; } echo 'result = ' . $result; 

Выход:

 Тугайный Ñоловей 

Что я могу сделать? Я должен положить $result в базу данных MySQL.

Какова кодировка вашего файла? Это тоже должен быть UTF8. Какова стандартная кодировка вашего HTTP-сервера? Это также должен быть UTF-8.

Кодировка работает только в том случае, если:

  • файл закодирован правильно
  • сервер сообщает, что такое кодировка поставляемого файла.

При работе с базами данных вам также необходимо установить правильную кодировку для полей БД и способ взаимодействия клиента MySQL с сервером (см. mysql_set_charset() ). Поля недостаточно, потому что ваш MySQL-клиент (в данном случае PHP) может быть установлен по умолчанию по умолчанию и переинтерпретирует данные. Таким образом, вы получаете UTF8 DB -> клиент ISO ->, введенный в скрипт PHP UTF8. Неудивительно, почему это испортилось в конце 🙂

Как обслуживать файл с правильной кодировкой?

header('Content-type: text/html; charset=utf-8') – это одно решение

.htaccess файл, содержащий AddDefaultCharset UTF-8 является еще одним

HTML-мета-контент-тип тоже может работать, но всегда лучше отправлять эту информацию с помощью HTTP-заголовков.

PS: вы также должны использовать mb_strlen() потому что strlen() в строках UTF8, вероятно, сообщит больше, чем реальную длину.

Я полагаю, ваш код находится в windiws-1251 так как он является русским 🙂 преобразует вашу строку в utf-8:

 $str = iconv('windows-1251', 'utf-8', $str); 

Если вы собираетесь отправлять смешанные данные и не хотите указывать utf-8 с помощью заголовка php, вы можете добавить этот html на свою страницу:

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

Если ваша база данных UTF-8, это нормально для mysql.

Для вашего эха, если вы сделаете это на веб-сайте, поместите это на верхнюю страницу:

 header('Content-Type: text/html; charset=UTF-8');