Интернационализация I

Спецсеминар "Разработка свободного ПО": 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.

Unicode

Это не кодировка. Это "реестр" символов. Символы "платонические".

"Платоническая" "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, и это не всё.