Отличие utf-8 и windows 1251
Отличие utf-8 и windows 1251. Рассмотрим, чем отличаются две кодировки "utf-8 и windows 1251" в теории и на практике. И как победить некоторые проблемы для кириллицы в utf-8!?
О разнице между двумя кодировками utf-8 и windows 1251
- О кодировках utf-8 и windows 1251
- Пример вывода текста в кодировках utf-8
латиницы - Пример вывода текста в кодировках utf-8
кириллицы - Пример отличия в кодировках utf-8 и windows 1251
- Как
перекодировать строку из utf-8 в windows 1251 - Что лучше для кириллицы utf-8 или...
О кодировках utf-8 и windows 1251
Самое главное. что нас интересует, как и меня - в чем же отличие кодировок utf-8 и windows 1251. И отличается только кириллица!
Чем отличаются utf-8 и windows 1251
UTF-8 - это много-байтовая кодировка, а Windows- 1251 однобайтовая. И более того, отличие только в кириллице.
Количество байтов кириллицы в UTF-8 будет в 2 раза больше, чем 1). латиницы в UTF-8 и 2). латиницы + кириллицы в Windows- 1251 → примерГлавное отличие кодировок – это используемый набор символов. В UTF-8 гораздо больше количество символов возможно представить, чем в Windows- 1251. Кодировка Windows- 1251 однобайтовая, т.е. представить в ней можно только 255 символов. Для кириллицы, впрочем, этого вполне достаточно, именно поэтому однобайтовые кодировки до сих пор так массово применяются.
Что такое кодировка windows 1251
Windows-1251 – набор символов и кодировка, являющаяся стандартной 8-битной кодировкой для всех русских версий Microsoft Windows. Пользуется довольно большой популярностью. Windows-1251 выгодно отличается от других 8‑битных кириллических кодировок (таких как CP866, KOI8-R и ISO 8859-5) наличием практически всех символов, использующихся в русской типографике для обычного текста; она также содержит все символы для близких к русскому языку языков: украинского, белорусского, сербского и болгарского.
Что такое кодировка UTF-8
UTF-8 – в настоящее время распространённая кодировка, реализующая представление Юникода, совместимое с 8-битным кодированием текста. Нашла широкое применение в операционных системах и веб-пространстве. Текст, состоящий только из символов Юникода с номерами меньше 128, при записи в UTF-8 превращается в обычный текст ASCII. Остальные символы Юникода изображаются последовательностями длиной от 2 до 6 байт.
Символ в кодировке UTF-8 может кодироваться аж 6 байтами (пока используется только 4 и больше не планируется). Для русского языка, например, символ занимает 2 байта. Все символы, которые есть в таблице символов – поддерживаются этой кодировкой. К примеру, если вам нужен знак копирайта (©), то вам не нужно искать особый шрифт или же изображать символов в графическом формате.
Пример вывода текста в кодировках utf-8 латиницы
Когда и если вы прочитали теорию о разнице кодировок utf-8 и windows 1251 - это уже победа!
А если вы еще и поняли о чем идет речь, то вы вообще Эйнштейн! , то и смысла особого вам читать дальше нет.
А для всех остальных продолжим...
Чем отличается текст в кодировках utf-8 и windows 1251
Теория - это конечно классно и круто, но как обстоит дело на практике!
Как показать отличие двух кодировок!?
У нас на сайте основная кодировка utf-8, и мы не напрягаясь можем посмотреть, что творится с текстом в этой кодировке!
Нам понадобится какой-то текст на латинице:
И... нам нужно такое слово, чтобы имело одинаковое количество букв в слове, ну пусть это будет моё имя...
Пусть это будет слово - "Marat!"
Далее нам потребуется функция var_dump.
И выведем прямо здесь вот такую конструкцию :
Результат:
Что мы здесь можем прочитать!?
Что это строка, и что в ней 5 элементов.
Пример вывода текста в кодировках utf-8 кириллицы
Теперь, проделаем тоже самое со строкой на кириллице:
У нас все таже кодировка utf-8.
Но теперь нам понадобится текст на кириллице:
Пусть это будет слово - "Марат!"
Опять var_dump.
И выведем прямо здесь вот такую конструкцию :
Результат:
И что мы здесь видим!?
Что количество элементов в строке 10... Если вы читали теорию внимательно, то вот вам показатель того, что одна буква состоит из двух символов, а латиницы это не касается...!
Поэтому, и возникают проблемы с текстом в кодировке utf-8 кириллицы, множество функций тупо не работают.
Как пример...как-то я задолбался со strtolower в utf-8 для кириллицы, что решил написать собственную функцию strtolower, чтобы каждый раз не городить этажерку из нескольких функций...
Пример отличия в кодировках utf-8 и windows 1251
Если вы поленились прочитать два верхних пункта, то ещё раз выведем результаты вывода текста на латинице и на кириллице с одним количеством букв.
Результат вывода
Результат
Что делать, если функция для кириллицы на utf-8 не работают?
Поскольку я давно занимаюсь сайтами, то могу сказать, что на самом деле таких случаев не так много, когда нужна какая-то специальная функция для обработки кириллицы на utf-8.
Но если уж она возникала, то есть несколько вариантов решения!
Это функции с приставкой "mb_", естественно надо проверять, работает ли она у вас на хостинге.
Второй вариант, это написать собственную функцию, которая будет работать и для латиницы и кириллицы? как это я показал на функции strtolower
И третий вариант перекодировать строку из utf-8 в windows 1251
Пусть это будет функция str_split и её аналог mb_str_split
print_r (str_split('Марат')); выдаст :
(
[0] =>
[1] =>
[2] =>
[3] =>
[4] =>
[5] =>
[6] =>
[7] =>
[8] =>
[9] =>
)
print_r (mb_str_split('Марат')); выдаст :
Как видим... полный отстой...
Мы далее разбирались с этим здесь.Как перекодировать строку из utf-8 в windows 1251
Итак... есть третий вариант, борьбы с квадратиками(непонимание кодировки) - перекодировать строку из utf-8 в windows 1251:
После того, как вы выполнили все намеченные действия с текстом, возвращаем его в исходную кодировку :
Рассмотрим пример перекодировки текста из UTF-8 в windows-1251 и обратно
Мы использовали var_dump, и он посчитал не правильно, поскольку просто так, на страницу вывести данные с помощью var_dump нельзя, мы использовали вот такой костыль :
ob_start();
var_dump( 'Марат' );
echo ob_get_clean();
Теперь попробуем перекодировать строку прямо внутри :
ob_start();
var_dump(iconv("UTF-8", "windows-1251", 'Марат')) ;
echo ob_get_clean() ;
Результат подсчета знаков верный, но видим что слово не было перекодировано обратно :
Исправим:
ob_start();
var_dump(iconv("UTF-8", "windows-1251", 'Марат')) ;
echo iconv("windows-1251", "UTF-8", ob_get_clean());
Результат :
Итак... вы видели процесс кодировки и перекодировки текста из utf-8 в windows 1251, а потом обратно!
Что за дичь здесь происходит!? Это не дичь! Когда ты внутри, а не снаружи, то все кажется не простым, а очень простым.
И чем больше ты в теме, это просто, как есть, пить, дышать... просто не задумываешься...
Я не говорю, что всегда так, иногда бывает очень трудно какаю-то задачку решить...
Что лучше для кириллицы utf-8 или...
Интересный поисковый запрос - "Что лучше для кириллицы utf-8 или..."...
Дело в том, что я выбрал кодировку "utf-8" уже... 15 лет(число динамичное) назад... и... уже сейчас трудно вспомнить, почему именно её... но точно вам могу заявить, что когда-то пользовался "windows-1251"... и у неё были какие-то заморочки, в виде неадекватного вывода информации, что, я волей неволей перешел на "utf-8"
Какие минусы у utf-8?
Одна из самых главных проблем "utf-8" - это многобайтовость...
Да! Это несколько неудобно в самом начале, но для всякой функции, которая не хочет работать с кириллицей, существуют замены.
В процессе создания сайта у вас может возникнуть несколько проблем, которые вы решите и "тупо" забудете об этом...
Задумывался ли я о переходе с кодировки utf-8 на другую?
Смысл задумываться о переходе с кодировки utf-8 на другую, если всё работает так, как нужно!
Свои комменты в ожидании переделки!
Когда сделаю не знаю!
Времени нет...
Иначе сообщение будет удалено, вас в бан - все просто!
Но если, сил нет как хочется высказать всё, что вы думаете об этом, пожалуйста - комменты от Vk - форма ниже: