Кодировка utf. Кодировка HTML-страницы
Причиной разобраться в том, как же работает UTF-8 и что такое Юникод заставил тот факт, что VBScript не имеет встроенных функций работы с UTF-8. А так как ничего рабочего не нашел, то пришлось писть/дописывать самому. Опыт на мой взгляд полезный в любом случае. Для лучшего понимания начну с теории.
О Юникоде
До появления Юникода широко использовались 8-битные кодировки, главные минусы которых очевидны:- Всего 255 символов, да и то часть из них не графические;
- Возможность открыть документ не с той кодировкой, в которой он был создан;
- Шрифты необходимо создавать для каждой кодировки.
О UTF-8
Когда-то я думал что есть Юникод, а есть UTF-8. Позже я узнал, что ошибался.UTF-8 является лишь представлением Юникода в 8-битном виде. Символы с кодами меньше 128 представляются одним байтом, а так как в Юникоде они повторяют ASCII, то текст написанный только этими символами будет являться текстом в ASCII. Символы же с кодами от 128 кодируются 2-мя байтами, с кодами от 2048 - 3-мя, от 65536 - 4-мя. Так можно было бы и до 6-ти байт дойти, но кодировать ими уже ничего.
0x00000000 - 0x0000007F: 0xxxxxxx 0x00000080 - 0x000007FF: 110xxxxx 10xxxxxx 0x00000800 - 0x0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx 0x00010000 - 0x001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
Кодируем в UTF-8
Порядок действий примерно такой:- Каждый символ превращаем в Юникод.
- Проверяем из какого символ диапазона.
- Если код символа меньше 128, то к результату добавляем его в неизменном виде.
- Если код символа меньше 2048, то берем последние 6 бит и первые 5 бит кода символа. К первым 5 битам добавляем 0xC0 и получаем первый байт последовательности, а к последним 6 битам добавляем 0x80 и получаем второй байт. Конкатенируем и добавляем к результату.
- Похожим образом можем продолжить и для больших кодов, но если символ за пределами U+FFFF придется иметь дело с UTF-16 суррогатами.
Декодируем UTF-8
- Ищем первый символ вида 11xxxxxx
- Считаем все последующие байты вида 10xxxxxx
- Если последовательность из двух байт и первый байт вида 110xxxxx, то отсекаем приставки и складываем, умножив первый байт на 0x40.
- Аналогично для более длинных последовательностей.
- Заменяем всю последовательность на нужный символ Юникода.
Последние несколько часов я провел на своем веб-сайте, чтобы проверить HTML 4.01 Strict, и я на самом деле преуспел в этом, но есть еще одно предупреждение, от которого я не могу избавиться. Предупреждение:
Несоответствие кодировки символов!
Кодировка символов, указанная в HTTP-заголовок (iso-8859-1) является отличается от значения в элемент (utf-8). Я буду использовать значение из заголовка HTTP (iso-8859-1) для это подтверждение.
Для получения общей информации о том, как изменить заголовок набора символов в разных сетевых стеках, см. http://www.w3.org/International/O-HTTP-charset
2018-05-25 13:30
Сервер четко маркирует документ как ISO-8859-1 в заголовках HTTP. Попробуйте сохранить default.html с использованием кодировки UTF-8 с помощью соответствующего редактора.
2018-05-25 03:07
Хорошо, я придумал частичное решение моей проблемы. Поскольку это был только файл default.html, который вызывал предупреждение, я предположил, что сервер делает что-то особенное для него из-за его имени. Поэтому я создал новый файл home.html с тем же содержимым, что и файл default.html, и указал файл.htaccess на новый файл (см. Строку 3 ниже).
# Use PHP5 as default AddHandler application/x-httpd-php5 .php DirectoryIndex home.html AddDefaultCharset UTF-8
Это устранило проблему, и все файлы теперь распознаются как UTF-8. Я все еще не уверен, что сервер делает с файлом default.html или где настройки, касающиеся этого, но по мере того, как моя проблема ушла, я забуду об этом.
(коды от 0 до 127), т.е. одним байтом кодируются латинские буквы, цифры и специальные символы. Русские буквы (кириллица) представляются 16-битными (двухбайтными) кодами:
110XXXXX 10XXXXXX,
где X обозначены двоичные разряды для размещения кода символа в соответствии с таблицей UNICODE .
Юникод (англ. Unicode) - стандарт кодирования символов, позволяющий представить знаки почти всех письменных языков. Представляемые в юникоде символы кодируются целыми числами без знака. Эти числа будем называть кодами символов в юникоде или просто UNICODE . Юникод имеет несколько форм представления символов в компьютере: UTF-8, UTF-16 (UTF-16BE, UTF-16LE) и UTF-32 (UTF-32BE, UTF-32LE) . (Англ. Unicode transformation format - UTF).
Рассмотрим, как кодируется в UTF-8 буква Ж . Её UNICODE - 1046 10 или 0416 16 или 10000 010110 2 . UNICODE в двоичном виде разбивается на две части: пять левых бит и шесть правых. Левая часть дополняется до байта признаком 110 двухбайтного кода UTF-8 : 110 10000. К правой части приписываются два бита 10 признака продолжения многобайтного кода: 10 010110. Окончательно код буквы Ж в UTF-8 выглядит так:
110
10000 10
010110 2
или D0 96 16
Таким образом, русская буква кодируется дважды: сначала в 11-битный UNICODE , а затем - в 16-битный UTF-8.
В приведённой ниже таблице, кроме кодов UNICODE и UTF-8 в шестнадцатиричной системе счисления, даны коды UTF-8 в десятичной системе счисления и для сравнения коды кириллицы в кодировке CP-1251 , иначе называемой windovs-1251 .
Символ | UNICODE | UTF-8 | CP-1251 | ||
---|---|---|---|---|---|
Шестн. | Десят | Шестн. | Десят | ||
А | 0410 | 1040 | D090 | 208 144 | 192 |
Б | 0411 | 1041 | D091 | 208 145 | 193 |
В | 0412 | 1042 | D092 | 208 146 | 194 |
Г | 0413 | 1043 | D093 | 208 147 | 195 |
Д | 0414 | 1044 | D094 | 208 148 | 196 |
Е | 0415 | 1045 | D095 | 208 149 | 197 |
Ж | 0416 | 1046 | D096 | 208 150 | 198 |
З | 0417 | 1047 | D097 | 208 151 | 199 |
И | 0418 | 1048 | D098 | 208 152 | 200 |
Й | 0419 | 1049 | D099 | 208 153 | 201 |
К | 041A | 1050 | D09A | 208 154 | 202 |
Л | 041B | 1051 | D09B | 208 155 | 203 |
М | 041C | 1052 | D09C | 208 156 | 204 |
Н | 041D | 1053 | D09D | 208 157 | 205 |
О | 041E | 1054 | D09E | 208 158 | 206 |
П | 041F | 1055 | D09F | 208 159 | 207 |
Р | 0420 | 1056 | D0A0 | 208 160 | 208 |
С | 0421 | 1057 | D0A1 | 208 161 | 209 |
Т | 0422 | 1058 | D0A2 | 208 162 | 210 |
У | 0423 | 1059 | D0A3 | 208 163 | 211 |
Ф | 0424 | 1060 | D0A4 | 208 164 | 212 |
Х | 0425 | 1061 | D0A5 | 208 165 | 213 |
Ц | 0426 | 1062 | D0A6 | 208 166 | 214 |
Ч | 0427 | 1063 | D0A7 | 208 167 | 215 |
Ш | 0428 | 1064 | D0A8 | 208 168 | 216 |
Щ | 0429 | 1065 | D0A9 | 208 169 | 217 |
Ъ | 042A | 1066 | D0AA | 208 170 | 218 |
Ы | 042B | 1067 | D0AB | 208 171 | 219 |
Ь | 042C | 1068 | D0AC | 208 172 | 220 |
Э | 042D | 1069 | D0AD | 208 173 | 221 |
Ю | 042E | 1070 | D0AE | 208 174 | 222 |
Я | 042F | 1071 | D0AF | 208 175 | 223 |
а | 0430 | 1072 | D0B0 | 208 176 | 224 |
б | 0431 | 1073 | D0B1 | 208 177 | 225 |
в | 0432 | 1074 | D0B2 | 208 178 | 226 |
г | 0433 | 1075 | D0B3 | 208 179 | 227 |
д | 0434 | 1076 | D0B4 | 208 180 | 228 |
е | 0435 | 1077 | D0B5 | 208 181 | 229 |
ж | 0436 | 1078 | D0B6 | 208 182 | 230 |
з | 0437 | 1079 | D0B7 | 208 183 | 231 |
и | 0438 | 1080 | D0B8 | 208 184 | 232 |
й | 0439 | 1081 | D0B9 | 208 185 | 233 |
к | 043A | 1082 | D0BA | 208 186 | 234 |
л | 043B | 1083 | D0BB | 208 187 | 235 |
м | 043C | 1084 | D0BC | 208 188 | 236 |
н | 043D | 1085 | D0BD | 208 189 | 237 |
о | 043E | 1086 | D0BE | 208 190 | 238 |
п | 043F | 1087 | D0BF | 208 191 | 239 |
р | 0440 | 1088 | D180 | 209 128 | 240 |
с | 0441 | 1089 | D181 | 209 129 | 241 |
т | 0442 | 1090 | D182 | 209 130 | 242 |
у | 0443 | 1091 | D183 | 209 131 | 243 |
ф | 0444 | 1092 | D184 | 209 132 | 244 |
х | 0445 | 1093 | D185 | 209 133 | 245 |
ц | 0446 | 1094 | D186 | 209 134 | 246 |
ч | 0447 | 1095 | D187 | 209 135 | 247 |
ш | 0448 | 1096 | D188 | 209 136 | 248 |
щ | 0449 | 1097 | D189 | 209 137 | 249 |
ъ | 044A | 1098 | D18A | 209 138 | 250 |
ы | 044B | 1099 | D18B | 209 139 | 251 |
ь | 044C | 1100 | D18C | 209 140 | 252 |
э | 044D | 1101 | D18D | 209 141 | 253 |
ю | 044E | 1102 | D18E | 209 142 | 254 |
я | 044F | 1103 | D18F | 209 143 | 255 |
Символы вне общего правила | |||||
Ё | 0401 | 1025 | D001 | 208 101 | 168 |
ё | 0451 | 1025 | D191 | 209 145 | 184 |
Одной из самых частых проблем, с которой сталкивается начинающий Web-мастер (да и не только начинающие), это проблемы с кодировкой на сайте . Даже у меня постоянно появляется при создании сайтов "абракадабра ". Но, благо, я прекрасно знаю, как эту проблему решить, поэтому всё привожу в порядок в течение нескольких секунд. И в этой статье я постараюсь научить Вас также быстро решать проблемы, связанные с кодировкой на сайте .
Первое, что стоит отметить, это то, что все проблемы с появлением "абракадабры" связаны с несовпадением кодировки документа и кодировки, выставляемой браузером . Допустим, документ в windows-1251 , а браузер почему-то выставляет UTF-8 . А уже источником такого несовпадения могут быть следующие причины.
Первая причина
Неправильно прописан мета-тег content-type . Будьте внимательны, в нём всегда должна находиться та кодировка, в котором написан Ваш документ.
Вторая причина
Вроде бы, мета-тег прописан так, как Вы хотите, и браузер выставляет именно то, что Вы хотите, но почему-то всё равно с кодировкой проблемы. Здесь, почти наверняка, виновато то, что сам документ имеет отличную кодировку. Если Вы работаете в Notepad++ , то внизу справа есть название кодировки текущего документа (например, ANSI ). Если Вы ставите в мета-теге UTF-8 , а сам документ написан в ANSI , то сделайте преобразование в UTF-8 (через меню "Кодировки " и пункт "Преобразовать в UTF-8 без BOM ").
Третья причина
Четвёртая причина
И, наконец, последняя популярная причина - это проблема с кодировкой в базе данных . Во-первых, убедитесь, что все Ваши таблицы и поля написаны в одной кодировке, которая совпадает с кодировкой остального сайта. Если это не помогло, то сразу после подключения в скрипте выполните следующий запрос:
SET NAMES "utf8"
Вместо "utf8 " может стоять другая кодировка. После этого все данные из базы должны выходить в правильной кодировке.
В данной статье я, надеюсь, разобрал, как минимум, 90% проблем, связанных с появлением "абракадабры" на сайте . Теперь Вы должны расправляться с такой популярной и простой проблемой, как неправильная кодировка, в два счёта.
Те, у кого старые сайты, могут столкнуться с такой проблемой, что необходимо перевести файлы в кодировку UTF-8. К их числу я смело могу назвать и себя. Начала делать сайты более 10 лет назад, когда об этой кодировке было мало что известно. На всех страницах у меня стояла кодировка:
За эти годы некоторые мои сайты распухли до тысячи и более страниц и переделывать все эти тысячные страницы не хватит никаких сил и времени.
Сейчас уже так не пишут. На смену старому пришло новое - HTML5, где нужно прописать:
Скажу честно, все же решила я все перелопатить вручную и вот как это у меня происходило:
- Открывала файл в Notepad++
- Выделяла весть текст
- Копировала весь текст
- Переводила кодировку в UTF-8
- Вставляла текст
- Проверяла опять - в той ли кодировке стоит?
- Сохраняла файл
И вот два дня я так долбила один свой сайт.
Можно, конечно же и не менять ничего. Но ведь старые сайты мои давно устарели, нужно переводить их и на современную верстку HTML5 и CSS3, плюс мобильную и адаптивную верстку. И лучше это делать в более продвинутых программах, а не в Notepad++.
Короче, приуныла я. Однако приехал сын-программист и все решил!
Оказывается все уже давно придумано. И если у Вас возникла такая же проблема - не отчаивайтесь! Есть прекрасная программа UTFCast Express
Эту программу можно скачать тут - http://www.rotatingscrew.com/utfcast-express.aspx - Это условно бесплатная программа, которая умеет конвертировать текст из разных кодировок в utf8. Доступна для ОС семейства Windows.
Запускаем UTFCast Express и указываем правильные пути: сверху - что конвертировать, снизу - куда складывать конвертированные файлы. Вам нужно просто выбрать нужные директории, программа сама перекодирует все нужные файлы из папки. Нажимаем "Start".
Единственно, заранее создайте новую папку, куда программа закачает все Ваши файлы из нужной папки.
Не забудьте также поставить галочку "Copy Unconverted". Нажимаете кнопочку "Start" и программа заработала!
Всего пара минут и все файлы волшебным образом перекодировались в нужную кодировочку!
Папку с прежними файлами можете просто удалить, чтобы не занимала место и работать дальше! Вперед, к новым высотам!
Ура, товарищи!!!
Что такое вообще UTF-8
Заметьте, что UTF-8 надо обязательно писать в верхнем регистре и через черточку, то есть никаких там utf-8, utf8 или UTF8. Пишите правильно!
UTF-8 (от англ. Unicode Transformation Format, 8-bit - «формат преобразования Юникода, 8-битный») - одна из общепринятых и стандартизированных кодировок текста, которая позволяет хранить символы Юникода, используя переменное количество байт (от 1 до 6).
Стандарт UTF-8 официально закреплён в документах RFC 3629 и ISO/IEC 10646 Annex D. Кодировка нашла широкое применение в UNIX-подобных операционных системах и веб-пространстве. Сам же формат UTF-8 был изобретён 2 сентября 1992 года Кеном Томпсоном и Робом Пайком и реализован в Plan 9. В качестве BOM использует последовательность байт EF16, BB16, BF16 (что у неё самой является трёхбайтовой реализацией символа FEFF16).
Одним из преимуществ является совместимость с ASCII - любые их 7-битные символы отображаются как есть, а остальные выдают пользователю мусор (шум). Поэтому в случае, если латинские буквы и простейшие знаки препинания (включая пробел) занимают существенный объём текста, UTF-8 даёт выигрыш по объёму по сравнению с UTF-16.