для передачи документов между странами или для хранения текста, .писанного на
разных языках. Unicode стала весьма популярна в Интер-;те, и некоторые языки
программирования даже поддерживают ее как стандартный формат: например, Java
использует Unicode как родной набоp символов для строк. Операционные системы
Plan 9 и Inferno испольч ют Unicode более широко — даже для имен файлов и
пользователей, Microsoft Windows
поддерживает набор символов Unicode, но не
считает о стандартом; большинство приложений Windows до сих пор лучше; .ботает
с ASCII, хотя соотношение стремительно меняется в пользу: nicode.
Надо сказать, что и у Unicode есть недостатки: символы в ней уже не гещаются в
один байт, поэтому текст в Unicode страдает от проблемы порядка байтов. Для
преодоления этой напасти документы
в Unicod перед передачей между программами
или по сети обычно преобразуются в кодировку потока байтов, называемую UTF-8. В
ней каждый 16-битовый символ кодируется для передачи как последовательность из
1, 2 или 3 байтов. Набор символов ASCII использует значения от 00 до 7F, все они
умещаются в один байт при использовании UTF-8. Таким образом, получается, что
UTF-8 односторонне совместима с ASCII.
Значения между 80 и 7FF представляются
двумя байтами, а значения от 800 и выше — тремя.LВ UTF-8 слово gargon
представляется байтами 67 61 72 СЗ А7 6F 6Е; значение Unicode E7 — символ g —
представляется в UTF-8 двумя байтами — СЗ А7.
Совместимость UTF-8 с ASCII весьма полезн-а, поскольку благодаря ей программы,
рассматривающие текст как непрерывный поток байтов, могут работать с текстом
Unicode на любом языке. Мы
опробовали программу markov из третьей главы с
текстом в UTF-8 на русском, греческом, японском и китайском языках, и она
работала без каких-либо проблем. Для европейских языков, слова в которых
разделяются ASCII-символами пробелов, табуляции или перевода строки,
программа выдавала вполне сносный текст. При использовании других языков для
того, чтобы получить что-то приемлемое
на выходе, пришлось бы изменять правила
разбиения текста на слова.
С и C++ поддерживают "широкие символы" (wide characters), которые
представляются 16-битовыми или еще большими целыми. Суще-CTByiw и
соответствующие функции, которые могут быть использованы для обработки
символов в Unicode или в другом расширенном наборе символов. Строковые
константы из широких символов записываются как L". . ,". Однако и здесь
возникает
большая проблема с переносимостью: программа с константами из широких
символов может быть воспроизведена только на дисплее, использующем тот же
набор символов. Поскольку символы должны быть конвертированы в поток байтов
вроде UTF-8 для передачи между машинами, язык С предоставляет функции для
преобразования широких символов в байты и обратно. Однако какое
преобразование использовать
? Интерпретация набора символов и описания
кодировки потока байтов таятся в недрах библиотек, и вытащить их оттуда
достаточно сложно; ситуация складывается не в нашу пользу. Может статься, в
отдаленном светлом будущем все наконец придут к согласию об использовании
единого набора символов, но пока что от проблемы порядка байтов никуда нам не
деться.
Не ориентируйтесь только на английский язык. Создатели пользова-гельского
интерфейса должны помнить, что в различных языках на выражение одного и того
же понятия может потребоваться совершенно эазное количество символов, так что
на экране и в массивах должно быть достаточно места.