Я предполагаю, что у вас есть строка байтов "\xd0\xa2\xd0\xb5\xd1"
, которая будет представлять собой кодированную UTF-8 форму символов Те
(плюс один следующий байт, который является половиной символа).
Если вы просто echo()
, что на странице, которую вы объявили как UTF-8, она должна правильно отображаться в браузере:
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
...
something: <?php echo htmlspecialchars($something); ?>
Естественно, это также означает, что вам нужно будет сохранить сам файл .php
, используя кодировку UTF-8, если в нем есть какие-либо символы, отличные от ASCII. (Многие текстовые редакторы Windows, как правило, не сохраняют как UTF-8 по умолчанию , к сожалению.)
Если у вас должна быть страница не-UTF-8, вам придется использовать iconv()
для преобразования строки в любую кодировку, которую вы использовали, предположительно кодовую страницу Windows 1251 для русского языка ('cp1251'
). Но я бы настоятельно рекомендовал использовать UTF-8 для всего и вся.
редактировать комментарий:
если я делаю mysql_set_charset ("utf8", $ db) перед выбором строки - я получаю этот "ужас"
mysql_set_charset('utf8')
действительно правильно. Убедитесь, что вы включили meta
, как указано выше, и что браузер его видит (проверьте View-> Encoding is UTF-8).
Если вы получаете ТеÑ
даже при правильной отправке UTF-8, то я боюсь, что текущее содержимое вашей базы данных испорчено. Возможно, данные были вставлены ранее без правильного вызова mysql_set_charset
, или вы импортировали SQL, который использовал неправильную кодировку.
Если это так, то вам, вероятно, придется просмотреть каждую строку базы данных и «исправить» ее, используя iconv()
для преобразования UTF-8 в ISO-8859-1. Это должно отменить двойное кодирование UTF-8.
[править: 2]
iconv ("UTF-8", "ISO-8859-1", $ row ['name']), говорящее Примечание: iconv (): обнаружен недопустимый символ во входной строке.
ОК, поэтому ввод не является допустимой последовательностью UTF-8. Это может быть связано либо с тем, что вы вообще не получаете UTF-8 из базы данных, либо потому, что последовательность UTF-8 стала усеченной. Например, ваша строка "\xd0\xa2\xd0\xb5\xd1"
(которая читается как ISO-8859-1, выглядит как "ТеÑ"
) недопустима, так как конечная "Ñ"
- это только половина двухбайтовой последовательности UTF-8. Как UTF-8 в браузере он будет отображаться как Те�
.
Если это то, что у вас есть в вашей базе данных, вам нужно исправить данные там, прежде чем вы сможете продолжить.
все в порядке, если я повторяю $row['name']
без выполнения mysql_set_charset("utf8", $db)
Вы не подтвердили, что правильно отправляете UTF-8 и что браузер знает об этом (проверив View-> Encoding), поэтому не очень важно, что вы видите на экране, когда вы echo()
; мы не можем понять, какая исходная строка байтов была из этого.
Расскажите нам, что вы видите, когда вы echo bin2hex($row['name']);
. Это преобразует каждый байт в строке в шестнадцатеричные цифры, поэтому "\xd0\xa2\xd0\xb5\xd1"
будет выглядеть как d0a2d0b5d1
, если это то, что у вас есть.