Итак, притча воязыцах.
Кодировка или как избежать "китайской экспансии". (теория)
Что же такое "кодировка" и с чем её кушать. Самое большое заблуждение, которое вносит сумятицу в неокрепшие организмы начинающих программистов, это повсеместно используемый термин "кодировка файла".
Так вот. У файла нет кодировки. Нет такого понятия. Есть понятие "кодировка текста". У файла есть разные свойства - тип, размер (вес), дата создания, атрибуты и еще несколько. Но кодировки нет. Можете убедиться, посмотрев свойства любого файла (правой кнопкой -> свойства). Её там вы не найдете.
А вот у текста, записанного в файл, кодировка есть. Вообще грамотно говорить не "кодировка", а "набор символов" или "таблица символов". Так что же это все таки такое и откуда растут ноги.
Кодировка - это своего рода язык, который помогает компьютеру понимать вас и вам понимать компьютер. Потому что компютер оперирует машинным кодом, который, согласитесь, несколько нечитабелен. Именно он и пишется в файл. Попробуйте понять, что тут написано:
0x000000d0 0x0000009f 0x000000d1 0x00000080 0x000000d0 0x000000b8 0x000000d0
0x000000b2 0x000000d0 0x000000b5 0x000000d1 0x00000082 0x0000002c 0x00000020
0x000000d0 0x0000009c 0x000000d0 0x000000b8 0x000000d1 0x00000080 0x00000021
Так вот, для того, что бы это перевести, нужен словарь - таблица сопоставления. То есть компьютер должен знать, что именно рисовать в мониторе, если ему передана такая последовательность. Латинские символы кодируются везде одинаково. А вот другие отнюдь.
История возникновения разнообразия кодировок чем то сродни кроссбраузерности и имеет схожее происхождение и схожие проблемы. Исторически сложилось так, что нет единого стандарта (вернее он теперь есть, но он не является обязательным). Разные разработчики ПО применяли свои таблицы, что и повлекло за собой эту путаницу.
Допустим всеми любимая кодировка windows-1251 (она же CP1251) ни что иное, как изобретенная рускими крякерами таблица для подпольной русификации паленых видовских продуктов. Так как Microsoft в свое время не озаботился подобными вещами. Теперь это общепринятый стандарт.
Для UNIX платформ изобрели KOI-8 и так далее. Кодировок великая куча, кто во что горазд.
Все (большинство) эти таблицы имеются в читающих инструментах, к которым относятся и браузеры. Нужно только знать, какую именно применить в данный момент. А по самому файлу (или потоку данных) это сделать невозможно.
И вот бедный браузер теперь в растеренности - что ему прислали и как это перевести в удобоваримую форму. Можно задать кодировку вручную, но не каждый юзер умеет это делать. По этому, что бы браузер знал, как перевести эти кракозяблы, нужно позаботиться заранее и дать ему ключ к коду (указать кодировку). Отдельно от передаваемых данных. Фактически удаленно настроить читающий инструмент.
Делается это двумя способами - заголовками или специальным метатегом.
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Заголовок посылает сервер, это обязательный атрибут. Метатег - вещь не обязательная и иной раз вредная. Во первых браузеры иногда глючат при работе с ним, во вторых - если случайно окажется, что сервер послал одну кодировку, а метатег укажет другую - появится неоднозначность.
Метатег стоит применять только тогда, когда html файл открывается браузером напрямую, без сервера. Тогда ему просто неоткуда взять информацию о кодировке (заголовков то нету).
Заставить сервер отправить нужный заголовок можно двумя способами. Вернее он и так отправит, но желательно ему указать что именно отправлять.
Способ первый. Функция header()
header("Content-Type: text/html; charset=utf-8");
Тут она сразу определяет контент-тип и кодировку.
Способ второй. .htaccess
Открываем, пишем:
AddDefaultCharset UTF-8
То же самое происходит и с базами данных. Ведь любая база данных основана на тех же самых файлах и подчиняется тем же законам. Нужно обязательно указывать, с чем собираемся работать. Делается это установкой кодировки соединения. В MySQL к примеру так:
mysql_query('SET NAMES utf8');, а лучше так:
mysql_set_charset('utf8');если позволит версия PHP (PHP 5 >= 5.2.3)
По этому очень важно соответствие содержимого файла с передаваемым атрибутом "charset". Иначе машинный код будет сопоставлен с другой таблицей и вылезут преславутые кракозяблы.
Так что способ борьбы с ними один - внимательно следить за соответствием содержимого и заголовков.
Сейчас есть общепринятый стандарт - UTF-8 (RFC 3629). Эта таблица содержит почти все возможные символы, которые могут встретиться в природе. Начиная от латиницы, заканчивая письменностью народов майя По этому работать с ней легко и приятно, никаких неоднозначностей. И никаких кракозяблов.
И чем больше народу это поймет, тем быстрее будет устранен разброд и шатание.
Самым большим аргументом против, приводящимся ортодоксами в защиту местечковых кодировок - увеличение веса файлов. Дело в том, что символов очень много и описать все в пределах одного байта невозможно. От того и называется кодировка многобайтной. Соответственно нужно больше места.
Но тут палка о двух концах. Во первых латиница и служебные символы в UTF-8 занимают такой же объем, как и в других. А во вторых, многие инструменты работают только с UTF (аякс, XML и прчее). Для перекодировки требуется больше гораздо больше ресурсов.
Так что мой вам совет: привыкайте сразу к хорошему, все равно за этим будущее.
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.
Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.
Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.