Как мне превратить «Ð ¢ еѻ (это русское слово) во что-то читаемое? - PullRequest
3 голосов
/ 07 июля 2010

У меня есть MySQL DB, которая содержит столбец UTF8 с такими записями.PHP mb_detect_encoding () сказал мне, что это UTF-8.Как я могу превратить этот «ужас» во что-то читаемое?

Спасибо

Ответы [ 2 ]

9 голосов
/ 07 июля 2010

Я предполагаю, что у вас есть строка байтов "\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, если это то, что у вас есть.

1 голос
/ 07 июля 2010

вывод на страницу с указанной кодировкой UTF8. браузер покажет его в удобочитаемой форме.

...