3 байта переслатьИз-за ...

09:54 08.04.2008

3 байта переслать

Из-за несогласованности кодировок встречаются досадные ошибки. Например, если у вас HTML-файл в UTF-8, а CSS и Java-script в Windows-1251, то некоторые браузеры могут вести себя весьма неожиданно, а то и вовсе не работать. Необходимо, чтобы все, кто работает над проектом, знали про несущую кодировку. А если не знаешь — так открой и посмотри, что за кодировка и какой тип сигнатуры. Причем, если файл не содержит русских комментариев, вполне возможно, что вы увидите кодировку ANSI вместо UTF-8. Смотрите файлы, где есть русский язык.

UTF-8 - реализация юникод-кодирования символов, выделяющая на каждый знак от 1 до 8 байтов (поэтому и UTF-8, собственно). Все латинские символы, арабские цифры и стандартные знаки препинания (первая половина ASCII) занимают по 1 байту, на все остальные символы выделяется от 2 до 8 байт. Здесь-то и проявляется экономия - размер файла зависит не только от количества знаков, но и от уникальности последних. В настоящее время символы, занимающие больше 4 байтов, не используется - ну не смог формат вместить в себя все разнообразие существующих на свете знаков во всех видах письменности, и ему на смену готовится UTF-16.

Если файл в UTF-8 содержит только знаки ASCII, то при просмотре текстовый редактор может открыть файл в другой кодировке — разницы нет, что та, что эта кодировка. Все символы будут отображаться правильно, но вот изменяя файл и дописывая русский текст, необходимо быть твёрдо уверенным, что ваша кодировка — действительно та, что используется на проекте. В противном случае возможны ошибки. Потому что в UTF-8 русский символ — 2 байта, а в ASCII — 1.

Ещё следует знать, что есть сигнатура UTF-8 (или BOM; Byte Order Mark) и она занимает первые 3 байта файла.
Все файлы в UTF-8 кодировке, создаваемые в Windows, по умолчанию сохраняются с BOM, будь то браузер ИЕ или текстовый редактор notepad. А как иначе, ведь это придумала Майкрософт =) Однако, не стоит этого делать, потому что и в html, и в XML есть внутренние структуры, помогающие программам определить кодировку файла. Иначе, для чего их тогда придумали? Стандарты есть, в конце-концов. Многие программы понимают сигнатуру: кто-то сразу её режет, кто-то нормально работает. А кто-то вообще не переваривает и либо выдаёт ошибки, либо внедряет в файл непонятные 3 знака в начале строки.
По возможности, всегда сохраняйте чистый UTF-8, это поможет вам избежать проблем при портировании файлов.

Для XML

<?xml version="1.0" encoding="UTF-8"?>

Для HTML

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

Для чего нужна такая информация? Например, если html файл с кодировкой UTF-8 передать браузеру без управляющей информации, то последний не сможет автоматически определить кодировку потока. Если же записать BOM или мета-тег, то все отобразится правильно. А полная схема представляет собой следущее: сначала сервер определяет кодировку передачи данных, затем передаёт файл. Если кодировка явно не указана, то он выбирает значение по умолчанию. Всегда сами задавайте, что и как будет выдавать сервер.

Затем, когда браузер получает файл, он читает заголовок потока, и, если встречает значение кодировки, то в ней и показывает html-данные. Если же кодировка не указана, то он пытается прочитать BOM или мета-тег файла. Если и тут ничего нет — тогда браузер выбирает кодировку по умолчанию, и, чаще всего, ошибается. Не забывайте про настройки сервера.

Здесь можно подумать, что, указав кодировку на сервере, можно не указывать мета-тег для файла. Теоретически верно, но, например, если пользователь сохранит HTML-файл себе на компьютер и потом откроет, то кодировка у него поедет, потому что серверные данные потока в файл не пишутся. Можно сказать, что для этого-то BOM и нужен, но его, как я уже говорил, сохраняет только ИЕ, остальные браузеры его игнорируют. Хотите чтобы пользователи читали офф-лайн страницы — прописывайте мета-тег. Да и по стандарту xhtml он обязателен.

Печатая миллионные строчки кода, делая структурированный текст, естественно, удобне пользоваться табом (и не заменять их на пробелы). Кому как будет хорошо — тот так и сделает настройки редактора.

Выжимка (upd. 1):
а) не пользоваться текстовыми редакторами, где нет возможности выбора сохранения UTF-8 c сигнатурой или без, ведь вы должны контролировать весь процесс создания файлов.
б) по возможности, всегда сохранять чистый UTF-8, это поможет избежать проблем при передаче данных и портировании.
в) не оставляйте сервера без присмотра со стандартными настройками. При переезде сэкономите нервы :)
г) меняйте пробелы на табы в настройках редактора текстов. Поддержка не будет ругаться в вашу сторону.

комментарии: 4

я злая поддержка, настроение паническое

 

mw

12:05 08.04.2008

Ой, мама дорогая...Поспорим?

UTF-8 имеет восьмёрочку на конце, потому что этот формат кодирует символы 8-битными последовательностями (а напр. UTF-16 - 16-битными), от 1 до 4, и именно поэтому совместим с US-ASCII кодированием в части, касающейся латиницы и управляющих символов.

Теоретически символ может быть представлен 6 байтами (но не 8!), но по соображениям совместимости используется максимум 4.

"размер файла зависит не только от количества знаков, но и от уникальности последних" - тут ты похоже не так выразился. если в файле будет "ААААААА", а во втором "АБВГДЕЁ", то размер их будет одинаков. Другое дело, что тут характерна особоенность - чем более редкий диалект кодируется, тем меньше бит приходится на один символ. (от 1 в случае латиницы до 4 в случае специфических знаков)

UTF-16 НЕ "готовится на смену" UTF-8. это лишь очередное альтернативное представление симовлов unicode. Имеет свои преимущества и недостатки.

BOM-не выдумка Майкрософт. Это символ юникода U+FFFE, призванный определять порядок следования байт для формата UTF-16. но иногда и для UTF-8 используется.

Если мой любимый текстовый редактор сохраняет UTF-8 файл с BOM, а я сниму эту галочку, то открыв этот файл в следующий раз мой редактор поймет файл как cp-1251 и если что-то поправить в заголовке (пока за кучей тэгов не видно русского текста) и не обратить внимание на то, в какой кодировке работаем, то прибыстром сохранении (Ctrl-S) от русского текста останутся одни воспоминания.

тэг <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> указывается также для того, чтобы если вдруг прокси пользователя обрезала заголовки с указанием кодировки, до пользователя дошел бы нормальный файл.

Размер позиции табуляции настраивается практически в каждом редакторе, поэтому если на компе несколько сред, в которых ты правишь файл, просто настрой их нормально. А вот затирать 16 пробелов вместо 4 табов при правке кода - то ещё удовольствие, да и размер исходника страдает - в 4 раза больше ненужной информации.

DenisX

12:32 08.04.2008

спасибо, но согласен не со всем :)

ceba

10:57 09.04.2008

+1 к последнему абзацу mw. Ненавижу пробелы вместо табов, всё прекрасно настраивается и выглядит везде одинаково. А вот когда мешаются пробелы и табы - вот это точно пиец.

я

DenisX

15:45 09.04.2008

себа, понял тебя

Добавить свой комментарий

 

 

 

 

 

Всего материалов: 558, комментариев: 1253.