Символы 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.


person Theo Smeets    schedule 20.04.2011    source источник


Ответы (7)


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

Кодирование работает только если:

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

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

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

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

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

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

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

person Capsule    schedule 20.04.2011
comment
Есть две вещи, которые нужно проверить: 1) ваша БД UTf-8, 2) тип вашего документа UTF-8? - person afuzzyllama; 20.04.2011
comment
@Matthieu да, грустно ... Я думаю, это потому, что большинство людей работают с английским языком и не беспокоятся о кодировке ;-) - person Capsule; 20.04.2011
comment
@Capsule: А? Вам еще нужна кодировка с английским!! - person tchrist; 22.04.2011
comment
@tchrist, конечно, но я говорил о кодировании, отличном от iso-8859-1, потому что, если вы не хотите использовать определенную пунктуацию или избегать использования html-объектов, вы можете придерживаться iso-8859-1 при использовании только английского языка. На самом деле вы можете придерживаться его при использовании французского и некоторых других языков, потому что общие акценты являются частью кодировки ISO. Люди, как правило, используют UTF-8, потому что он более универсален и позволяет избежать (ну, пытается избежать) головной боли, но большинство не проверяет, является ли вся установка пуленепробиваемой, потому что вы не обнаружите никаких проблем, пока не используете специальные символы UTF-8. . - person Capsule; 22.04.2011
comment
@Capsule: для французского языка требуется UTF-8 или, по крайней мере, ISO 8859-15. В противном случае вы пропустите œ, Œ, Ÿ. - person tchrist; 22.04.2011

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

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

Я полагаю, ваш код в кодировке windows-1251, так как он русский :) конвертируйте вашу строку в utf-8:

$str = iconv('windows-1251', 'utf-8', $str);
person Nemoden    schedule 20.04.2011

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

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

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

Просто добавьте эту строку в начале, после соединения с сервером:

mysqli_set_charset($conn,"utf8");
person Behnam Chaghajerdi    schedule 07.01.2020

если вы просто используете эхо php без заголовков html и т. д., это отлично сработало для меня.

$connect = mysqli_connect($host_name, $user_name, $password, $database); mysqli_set_charset($connect,"utf8");

person ralphb    schedule 11.03.2020

попробуй это:

    header('Content-Type: text/html; charset=UTF-8');
    header("Content-type: application/octetstream");
    header("Pragma: no-cache");
    header("Expires: 0");
    //print "$name_field\n$data";

    // با این کد درست شد
    print chr(255) . chr(254) . mb_convert_encoding("$name_field\n$data", 'UTF-16LE', 'UTF-8');
person Alireza S.T.    schedule 04.09.2019
comment
Почему вы отправили свой ответ с персидским комментарием здесь? Никому не пригодится. - person Saeid Amini; 04.09.2019