Почему этот расширенный символ ascii (â, é и т. Д.) Заменяется на символы <?>? - PullRequest
3 голосов
/ 22 июня 2009

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

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

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

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

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

UPDATE: У меня есть следующее в программе PHP, которая дает мои эти <?> Символы ...

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

И сразу после создания моего объекта Zend DB я задаю следующий запрос:

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

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

Также STATUS сообщает:

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

Глядя на источник страницы, я вижу

Br l Lake

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

и

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

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

Ответы [ 8 ]

19 голосов
/ 22 июня 2009

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

В 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. Вы можете найти более подробную информацию из этой замечательной статьи о кодировках символов и сети . Вы также можете получить исчерпывающий список кодировок здесь , если вам нужен определенный тип.


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

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

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

3 голосов
/ 22 июня 2009

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

Настройка

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

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

3 голосов
/ 22 июня 2009

Нет такого стандарта, называемого "расширенный ASCII", просто набор собственных расширений .

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

1 голос
/ 23 июня 2009

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

Быстрый ответ "SET NAMES UTF8".

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

1 голос
/ 22 июня 2009

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

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

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

EDIT

Убедитесь, что вы на самом деле храните данные как 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];

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

0 голосов
/ 18 апреля 2012

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

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

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

0 голосов
/ 23 июня 2009

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

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

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

0 голосов
/ 22 июня 2009

Вы должны закодировать все специальные символы в сущности HTML, а не в зависимости от кодировки.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...