Лучшая кодировка. UTF-8 vs cp1251

Web-разработка

Автор: Александр Степанов

1 нояб. 2011 г., 09:07:15  2408


Статья будет полезна начинающим разработчикам и разработчикам уже со стажем. Статья безценна в плане ее значимости в Web разработке. Спасибо, Константину Юревичу и nayjest, за эту статью, которуя я с удовольствием размещяю у себя на сайте.

Итак, почему же до сих пор большинство разработчиков используют сp1251(windows-1251)? Это связано с рядом причин.

Во-первых, большинство php-разработчиков до сих пор разрабатывают свои программы под ОС Windows(как ни странно), где cp1251 является стандартной кодировкой и ее поддерживают все текстовые редакторы. Лично я работаю под Linux, поэтому этой причины использования cp1251 мне не понять :)… Хотя, в windows уже даже стандартный блокнот поддерживает utf8 с таким же успехом, как и cp1251.

Во-вторых, исторически сложилось так, что старые версии MySQL (до 4й) — некорректно работали с utf8. Причем операции с сортировками глючили аж до версии 4.1. Поэтому очень много продуктов, которые развивались в течение многих лет до сих пор остаются на cp1251, а новички берут с них пример.

В-третьих, как мы знаем — один символ кириллицы в cp1251 занимает 1 байт, а в utf8 — 2 байта. Как ни странно, многих это пугает :). Однако сомнения будут развеяны ниже.

Навскидку больше не смог найти причин использования cp1251.
А вот причины использовать utf8 даже искать не пришлось — они очевидны!

Во-первых, В кодировке UTF?8 вы можете непосредственно включать в документ любые символы из всего набора Unicode. Старинные кодировки, такие как cp1251 или KOI8?R (извинте, но они на самом деле уже старинные, ибо будущее за utf8 :)) предоставляли не более 256 символов, а в Unicode есть свыше 100 000 символов. Среди них — типографские знаки (тире, кавычки, многоточие, апостроф, неразрывный пробел, неразрывный дефис и пр.), специальные символы (№, §, ©, ‰,? и пр.), буквы с диакритическими знаками и лигатуры (?, ?, ?, ?, ?,? и пр.), символы почти всех существующих в мире алфавитов (?, ?, ?, ?,, ?,? и пр.), пиктограммы и значки (?, ?, ?,? и пр.) и множество других символов. Самое классное в этом всём это то, что все эти символы можно вставлять непосредственно в редакторе (из таблицы символов или с помощью горячих клавиш), что делает код куда более читабельным, нежели использование кракозяб вроде? — или? (альтернативы в cp1251).

Во-вторых, хочется оспорить то, что страницы на utf8 имеют гораздо больший размер, чем на cp1251. Символы ASCII(латиница, арабские цифры, знаки препинания и т.д.) занимают в utf8 всего один байт, так же как и в cp1251. Таким образом при создании страниц на латинице никаких увеличений в размере страниц не наблюдается. С кириллицей — согласен. Если документ содержит только буквы русского алфавита и никаких других символов (что, согласитесь, бывает достаточно редко, ибо без html-тегов не сильно обойдешься :)) — то в UTF?8 он действительно станет в два раза больше. А если в нём, например, поровну русских и арабских букв — в UTF?8 он будет в два раза меньше, чем, например, в cp1251. Чаще всего — основной вес страницы составляет не html-код, а всякого рода javascript, flash, картинки, css и т.д. Тем, кто заботится о «весе», следовало бы в первую очередь выкинуть из кода подстановки для тех символов, которым они не нужны, например, — для длинного тире или для неразрывного пробела (ой, как часто я вижу это в страницах новичков). Видим, что вместо 1 знака длинного тире мы пишем 6, вместо 1 знака неразрывного пробела мы пишем 5 знаков. И где же экономия? Действительно, иногда доходит до маразма — некто упирается: «Не буду делать страницы в UTF?8, потому что они от этого увеличиваются» — а сам при этом ваяет код с жуткими атрибутами и подстановками, который без них мог бы быть в пять раз короче.

В-третьих, основное достоинство — это универсальность! Лично я не создаю свою CMS исключительно для русскоязычного сегмента рынка web-технологий. Благодаря utf-8 я могу создавать сайты без каких-либо переделок как для американцев, так и для немцев(с их буквочками вроде ?), так и для арабов, так и для китайцев! И мне все равно, какой кодировка у них установлена, а какая нет, ибо Юникод у них установлен 100%.

В-четвертых, Юникод является стандартом для работы таких частоиспользуемых ныне фунций php, как json_encode/json_decode, а так же используемого в Ajax XHttpRequest. Причем, начиная с 6й версии PHP Юникод станет стандартом почти для всех строковых функций.

И напоследок, многие ссылаются на то, что люди постепенно переходят на utf8 потому, что “кто-то умный сказал, что это хорошо”. Соглашусь, кто-то умный это сказал уже давно, а именно — Консорциум W3C (кому-то эти 3 буквы что-то говорят? :)). И рекомендует он использовать для создания веб-страниц ни что иное, как utf8. Для тех, кто знает английский (а есть программисты, кто его не знает? :)) — можете почитать тут: www.w3.org/International/questions/qa-utf8-upgrade.en.php

Автор: Константин Юревич
Источник: php.webconsulting.by/2008/05/03/luchshaya-kodirovka-utf-8-vs-cp1251/