HTML - символ фунта стерлингов из базы данных отображается как ? даже с кодировкой=UTF-8

У нас есть куча данных базы данных, которые кто-то ввел вручную. Они содержат много символов британского фунта стерлингов (£). Исходный пользователь скопировал/вставил знак фунта откуда-то, не уверен, где (я не уверен, имеет ли это значение или нет...).

В любом случае, при печати данных на странице PHP знаки фунта отображаются как символ замены. На странице есть <meta charset="utf-8"/>. В браузере, если вы измените кодировку на ISO-8859-1, знаки фунта отображаются правильно.

После некоторых копаний я пришел к выводу, что человек, вводивший исходные данные, скопировал/вставил в базу данных закодированный ISO-8859-1 знак фунта стерлингов. Поэтому, если страница не отображается с использованием ISO-8859-1, она не будет отображаться правильно.

Вот информация заголовка из Chrome:

Request URL:http://www.mysite.com/test.php
Request Method:GET
Status Code:200 OK
Request Headersview source
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Cookie:X-Mapping-goahf....
Host:www.mysite.com
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2
Response Headersview source
Connection:Keep-Alive
Content-Type:text/html; charset=UTF-8
Date:Wed, 07 Dec 2011 22:38:14 GMT
Server:Apache/2.2
Transfer-Encoding:chunked

Также в таблице MySQL указано, что она использует latin1_swedish_ci, которая была по умолчанию.

Итак, как мне решить эту проблему? Я мало знаю о том, как работает кодировка символов и что происходит, когда вы копируете/вставляете символы из одного места в другое.

Я попытался перейти на эту страницу:

http://www.fileformat.info/info/unicode/char/a3/browsertest.htm

И копирование символа фунта и вставка его в базу данных, думая, что это исправит это, но, похоже, это не так... Как мне сделать символ фунта, который находится в базе данных, символом фунта UTF-8 вместо ISO- 8859-1 ?


person Jake Wilson    schedule 07.12.2011    source источник


Ответы (2)


Неважно, откуда был скопирован оригинальный знак фунта стерлингов. Даже не важно, в какой кодировке он хранится в базе данных. База данных работает на уровне символов, а это означает, что если вы попросите ее сохранить символ £, она сохранит символ £; как именно это происходит за кулисами и какую кодировку он использует для этого, является деталью реализации, которая не имеет значения.

Чего вам не хватает, так это наличия кодирования соединения. Когда вы подключаетесь к базе данных, вы говорите с ней неявно или явно, используя определенный набор символов. Это означает, что любые байты, которые вы отправляете в базу данных, должны представлять символы в этой кодировке (поэтому база данных знает, какие символы она предположительно получает), и любые текстовые данные, которые вы получаете из базы данных, будут закодированы в этой кодировке. эту кодировку (чтобы вы знали, как обрабатывать результаты). По умолчанию для этой кодировки соединения часто используется кодировка Latin-1 (также известная как ISO-8859-1). Таким образом, когда вы получаете знак £ из базы данных, он на лету преобразует его в латиницу-1, в какой бы кодировке он ни хранился в базе данных. Таким образом, вы получаете знак £, закодированный в Latin-1, и выводите его как есть на свою страницу, но вы указываете браузеру интерпретировать страницу как UTF-8. Это, конечно, приводит к неверно истолкованному персонажу.

Вы можете изменить параметры подключения по умолчанию различными способами, либо в конфигурации MySQL, используя определенные методы в вашей клиентской библиотеке (которые вы не указываете), либо выполнив запрос SET NAMES utf8; после подключения к базе данных.

person deceze♦    schedule 08.12.2011
comment
SET NAMES utf8 работал отлично. Я работаю с общей базой данных, поэтому изменение конфигурации MySQL невозможно. Спасибо за урок! Кроме того, есть ли причина, по которой просто установка моей таблицы (или столбца) сортировки на utf8_general_ci не имеет значения? - person Jake Wilson; 08.12.2011

Вы не можете просто взять необработанный текст в одной кодировке и использовать метатег utf8 для его отображения.

Я не знаю, что такое кодировка latin1_swedish_ci, но вполне возможно, что это псевдоним iso-8859-1. Поэтому либо вы конвертируете кодировку в UTF-8, либо исправляете метатег, чтобы отображалась правильная кодировка.

Если вы собираетесь преобразовать его, я предлагаю iconv. Возможно, вам придется убедиться, что mysql также знает новую кодировку. Кажется, кто-то еще прошел через это на http://drupal.org/node/62258.

person koan    schedule 07.12.2011