Почему этот расширенный символ ascii (â, é и т. Д.) Заменяется символами ‹?›?

Почему этот расширенный символ ascii (â, é и т. Д.) Заменяется символами ‹?›?

Я прикрепил картинку ... но я использую PHP для извлечения данных из MySQL, и в некоторых из этих мест есть расширенные символы ... Я использую шрифт Arial.

Вы можете увидеть снимок экрана здесь: http://img269.imageshack.us/i/funnychar.png/

Все еще происходит после предложений, вот что я сделал:

Мой firefox (view-> encoding) настроен на UTF-8 после добавления строки, однако текст внутри тегов параметров по-прежнему показывает забавный символ вместо фактического акцентированного. Что мне теперь искать?

ОБНОВЛЕНИЕ: у меня в программе PHP есть следующие символы ‹?› ...

ini_set( 'default_charset', 'UTF-8' );

И сразу после создания объекта zend db я задаю следующий запрос:

$db->query("SET NAMES utf8;");

Я изменил все свои таблицы на UTF-8 и повторно вставил все данные (пустая трата времени), поскольку это никогда не помогало. Это было latin1 до.

Также СТАТУС сообщает:

Connection:             Localhost via UNIX socket
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:            /var/run/mysqld/mysqld.sock
Uptime:                 4 days 20 hours 59 min 41 sec

Посмотрев на источник страницы, я вижу ‹значение параметра =" Озеро Брюле "› Озеро Брюле

ОК - НОВОЕ ОБНОВЛЕНИЕ - Я изменил все в моем PHP и HTML на:

and

заголовок ('Content-Type: text / html; charset = latin1');

Теперь работает, что дает ?? Как мне все это преобразовать в UTF-8?


person MichaelICE    schedule 22.06.2009    source источник
comment
Какую версию Firefox вы используете, что дает вам? Я попытался воспроизвести вашу проблему, но не смог. Возможно ли, что на машине, на которой вы тестируете, не установлены правильные шрифты Unicode? Если вас интересует страница, на которой я тестировал, вы можете найти ее здесь: dan-herbert.com /unicode.htm   -  person Dan Herbert    schedule 23.06.2009
comment
Странно, dan-herbert.com/unicode.htm отлично смотрится в моем браузере ... так что устраняет firefox ...   -  person MichaelICE    schedule 23.06.2009
comment
Аналогичный вопрос здесь: stackoverflow.com/questions/241015/   -  person Simon East    schedule 03.09.2014


Ответы (8)


Это то, что делает браузер, когда не знает кодировку символа. Убедитесь, что вы указали тип кодировки текста, который вы отправляете клиенту, в заголовках или мета-разметке.

В HTML:

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

В PHP (до того, как любой другой контент будет отправлен клиенту):

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

Я предполагаю, что вам понадобится кодировка UTF-8. Если на вашем сайте используется другая кодировка текста, вам следует заменить UTF-8 кодировкой, которую вы используете.

При использовании HTML для указания кодировки следует отметить, что браузер перезапустит рендеринг страницы, как только увидит метатег Content-Type, поэтому вы должны включить тег <meta /> сразу после тега <head /> на своей странице, чтобы браузер не выполнял какая-либо дополнительная обработка, чем требуется.

Еще одна распространенная кодировка - iso-8859-1 (базовая латиница), которую вы можете использовать вместо UTF-8. Более подробную информацию можно найти в этой замечательной статье о кодировках символов и в Интернете. Вы также можете получить исчерпывающий список кодировок здесь, если вам нужен конкретный тип.


Если ничего не работает, другая (редкая) возможность заключается в том, что на вашем компьютере может не быть установлен шрифт с символами, необходимыми для отображения страницы. Я пробовал повторить ваши результаты на моем собственном сервере, и мне не повезло, возможно, потому, что у меня на моем компьютере установлено множество шрифтов, поэтому браузер всегда может заменить недоступные символы из одного шрифта другим шрифтом.

В ходе дальнейшего исследования я заметил, что если текст отправляется в кодировке, отличной от кодировки, о которой сообщает браузер, символы Unicode могут отображаться неожиданно. Чтобы обойти это, я использовал представление HTML-объекта специальных символов, поэтому â становится &#226; в моем HTML и é становится &#233;. Как только я это сделал, мои символы отображались правильно, независимо от того, в какой кодировке я указывал.

Очевидно, вы не хотите изменять свою базу данных для кодирования HTML-символов Unicode. Лучшим вариантом, если вам необходимо это сделать, является использование функции PHP, htmlentities() . Вы должны использовать эту функцию для любого управляемого данными текста, в котором вы ожидаете, что в нем будут символы Unicode. Это может раздражать, но если указание кодировки не помогает, это хорошее последнее средство для принудительной работы символов Unicode.

person Community    schedule 22.06.2009
comment
Я тоже. Престижность вашей скорости печати =) - person David says reinstate Monica; 22.06.2009
comment
Быстрый способ отладки этой возможности - вручную изменить кодировку в браузере. Например. используйте View- ›Кодировку символов в Firefox. - person Matthew Flaschen; 22.06.2009
comment
Моя огненная лиса установлена ​​в UTF-8 после добавления этой строки, однако текст внутри тегов параметров все еще показывает этот символ. Он отлично хранится в Mysql с акцентированными символами. - person MichaelICE; 22.06.2009
comment
Майк, я добавил некоторую информацию SQL к своему ответу ниже. - person Peter Bailey; 23.06.2009
comment
Материал htmlentities - ненужное усложнение - utf8 может кодировать что угодно, и на самом деле latin1 может кодировать любой из символов, необходимых для приложения. Этот вопросительный знак / ромб обычно указывает на неправильную кодировку. Если бы это был символ, для которого браузер не смог найти шрифт, это была бы пустая коробка с тофу. - person ; 23.06.2009
comment
@Matthew Flaschen и другие +4 - я использую View- ›Character Encoding, и страница перезагружается, и Firefox устанавливает ее обратно в UTF-8, как и должно быть. - person MichaelICE; 23.06.2009

Такого стандарта, называемого «расширенный ASCII», нет, только набор проприетарных расширений.

В любом случае, существует множество возможных причин, но это не ваш шрифт. Вы можете начать с проверки набора символов в MySQL, а затем посмотреть, что делает PHP. Как сказал Дэн, вам нужно убедиться, что PHP указывает кодировку символов, которую он действительно использует.

person Matthew Flaschen    schedule 22.06.2009

Как уже упоминалось, это вопрос о кодировке символов. Вам следует прочитать статью Джоэла Спольски о кодировке символов.

Параметр

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

исправит вашу проблему, если ваша php-страница записывает символы UTF-8 в браузер. Если текст все еще искажен, возможно, ваш текст не в формате UTF-8; в этом случае вам нужно использовать правильное имя кодировки в заголовке Content-Type. Если у вас есть выбор, всегда используйте UTF-8 или другую кодировку Unicode.

person Mr. Shiny and New 安宇    schedule 22.06.2009

Самое простое исправление

ini_set( 'default_charset', 'UTF-8' );

таким образом вам не нужно беспокоиться о ручной отправке заголовка Content-Type самостоятельно.

РЕДАКТИРОВАТЬ

Убедитесь, что вы действительно храните данные как UTF-8 - отправка данных, отличных от UTF-8, в браузер как UTF-8 с такой же вероятностью вызовет проблемы, как отправка данных UTF-8 в качестве другого символа набор.

SELECT table_collation
  FROM information_schema.`TABLES` T
 WHERE table_name=[Table Name];

SELECT default_character_set_name
     , default_collation_name
  FROM information_schema.`SCHEMATA` S
 WHERE schema_name=[Schema Name];

Проверить эти значения

person Peter Bailey    schedule 22.06.2009
comment
Изменять кодировку таблицы не нужно и не достаточно. Важно указать mysql, в какой кодировке передавать результаты (показывать такие переменные, как character_set_results). Mysql может правильно передавать как utf8 данные из таблиц latin1 (и наоборот в определенных пределах). - person ; 23.06.2009

Существует две кодировки передачи, PHP ‹-> browser и Mysql ‹-> PHP, и они должны согласовываться друг с другом. Настройка кодировки для Mysql ‹-> PHP рассматривается в ответах на вопросы ниже:

Быстрый ответ - «УСТАНОВИТЬ ИМЕНА UTF8».

Медленный ответ - прочитать статьи, рекомендованные в других ответах - гораздо лучше понять, что происходит, и внести одно точное изменение, чем применять метод проб и ошибок, пока все не станет работать. Это не просто косметическая проблема пользовательского интерфейса, неправильные конфигурации кодирования могут очень сильно испортить ваши данные. Подумайте об эпизоде ​​«Симпсоны», где Лиза попадает в волосы жевательной резинкой, от которой Мардж пытается избавиться, намазывая арахисовое масло.

person Community    schedule 22.06.2009

Вы должны кодировать все специальные символы в объекты HTML вместо того, чтобы зависеть от кодировки.

htmlentities () сделает всю работу за вас.

person VVS    schedule 22.06.2009

Я изменил все свои таблицы на UTF-8 и повторно вставил все данные (пустая трата времени), поскольку это никогда не помогало. Это было latin1 до.

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

Если у вас есть дамп SQL, я бы посоветовал запустить его с помощью инструмента для преобразования в UTF-8. Notepad ++ делает это очень хорошо - просто откройте файл, убедитесь, что символы с диакритическими знаками отображаются правильно, затем найдите в меню пункт «преобразовать в UTF-8».

person DisgruntledGoat    schedule 22.06.2009
comment
уже слишком поздно, если я сделаю дамп sql сейчас? - person MichaelICE; 23.06.2009
comment
Нет, думаю, все будет хорошо, но вы, конечно, можете попробовать и посмотреть. Сделайте дамп SQL, затем преобразуйте его в utf8 и проверьте правильность отображения символов. Если они есть, то вставка обратно в БД должна быть в порядке. Как сказал кто-то, вам все равно нужно будет запускать SET NAMES UTF8 при каждой загрузке страницы. - person DisgruntledGoat; 23.06.2009

Эти специальные символы обычно появляются из-за расширений. Если мы предоставим метатег с charset=utf-8, мы можем удалить их, добавив:

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

в ваши мета-теги

person yasin    schedule 18.04.2012