Спецсеминар "Разработка свободного ПО": http://uucode.com/oss2004/. 11-я лекция, 20 ноября 2004.
История про совместную работу над спутником. Одни писали для километров, другие вводили мили. Спутник промазал.
Наиболее полный свод правил, известный мне -- это LaTeX'овский babel.
Это в основном нужно в текстовых процессорах, но иногда приходится возиться с этим и в обычных программах, например:
X file(s) copied скопировано X файл(а,ов)
Есть коэффициент "разбухания" текста при переводе. Надо учитывать при создании GUI.
Про разделитель десятичных разрядов есть разные истории.
Правила:
Откуда компьютер берёт время:
Традиционно, внутреннее представление -- это число секунд с 1 января 1970 года. Проблема 2038-го года:
>> $x = 65535; >> $x = 32768 * 65535; >> print scalar(gmtime($x)), "\n"; Mon Jan 18 18:08:00 2038
Если для числа использовался обычный знаковый int, то сравнения дат будут работать некорректно.
Когда в Москве 10 часов, в Берлине 6 часов. В случае однопользовательского компа это всё просто. В нормальных системах сложнее.
Стандартный набор функций:
Из GMT в localtime -- не проблема. А вот обратно сложнее. Поэтому на компьютерах всё должно быть в GMT (и BIOS тоже). Что делать с Windows -- не знаю.
У каждого из пользователей выставлена переменная окружения TZ. Функция "localtime" ориентируется на неё.
$ date Сбт Ноя 20 07:46:29 MSK 2004 $ TZ=Europe/Berlin date Сбт Ноя 20 05:46:31 CET 2004
Бывает, что несколько зон имеют одинаковый GMT+X. Но на самом деле они разные из-за разных правил перехода на зимнее и летнее время.
MSD/MSK
etc/GMT+3 на самом деле GMT-3
Откуда берутся настройки зоны (glibc, /usr/share/tz). Иногда их приходится прикручивать вручную. Например, к Oracle.
Что надо запомнить:
Joel on Software "The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)" <http://joelonsoftware.com/articles/Unicode.html>
So I have an announcement to make: if you are a programmer working in 2003 and you don't know the basics of characters, character sets, encodings, and Unicode, and I catch you, I'm going to punish you by making you peel onions for 6 months in a submarine.
русские кодировки
неверно: plain text = ascii = characters are 8 bits.
Это не кодировка. Это "реестр" символов. Символы "платонические".
"Платоническая" "A" отличается от "B" и от "a", и от русской "А", но она то же самое, что "A" или "A". (Изоморфизм?). На самом деле, это не так просто:
Были политические баталии, более-менее как-то решили.
Буквам сопоставлены "магические числа". Например, для латинской буквы "A": U+0041. Полные карты -- на сайте http://www.unicode.org/. Их уже больше 65536.
Важно: unicode -- это не кодировка. Это абстрактное описание.
Hello: U+0048 U+0065 U+006C U+006C U+006F
А теперь про кодировки.
"Hello": 00 48 00 65 00 6C 00 6C 00 6F "Hello": 48 00 65 00 6C 00 6C 00 6F 00
Делают и так, и так. "FE FF" -- BOM -- Unicode Byte Order Mark. UCS-2/UTF-16, два варианта из-за BOM
Не всем понравилось: слишком большой расход памяти.
September 2, 1992, Pike и Thompson придумали за обедом utf8, а затем реализовали её, и система plan9 стала всюду использовать utf8.
utf8: от 1-го до 6-ти символов. Если буквы только латинские, то совпадает с ASCII.
А ещё бывают UTF-7 и UCS-4, и это не всё.