среда, 6 февраля 2008 г.

C++ Standard Library, UTF-8, UTF-16

На каникулах мне пришлось довольно глубоко влезть в стандартную библиотеку C++ и немного разобраться с кодировками путей файловых систем.

Летом я написал класс для чтения файлов двоичного формата. Для максимальной переносимости использовалась исключительно стандартная библиотека. Напомню, что вся работа с двоичными файлами в C++ должна проводиться при помощи классов-потоков вроде fstream. Объект класс fstream инициализируется конструктором вида(как и все классы этой группы):

fstream (const char *s, int)

Здесь const char* - C-строка, где располагается адрес файла, второй аргумент - флаги, определяющие режим доступа к файлу. Это - именно определенная стандартом конструкция и, полагаю, очень часто используется в различных библиотеках.

Напомню также, что в NTFS для записи путей к файлам используется Unicode (UTF-16). UTF-16 для хранения информации о символе использует два байта и не совместима со стандартной ASCII.

В этот самый const char* никак не записать путь, состоящий из символов UTF-16, адрес надо указывать именно в однобайтных символах.

Забавно получается! Стандартная библиотека языка поддерживает чтение многобайтных кодировок из файла, но не гарантирует открытие названий файлов многобайтных кодировок вроде UTF-16 в NTFS; и открываемый под Windows адрес обязательно должен состоять из символов ASCII.

Пары байт Unicode пройти как последовательность символов в памяти не могут, потому что в них могут встретиться нулевые с точки зрения C-строк последовательности, закрывающие строку.

UTF-8 же можно передавать в таких строках. Дело в том, что последняя варьирует число используемых байт от одного до четырех, сохраняя при этом обратную совместимость с 7-битной таблицей символов ASCII; гарантируется, что ни один из байтов не будет представлять собой закрывающий C-строку нулевой байт.

Получилось, что файлы с русскими символами в пути под Линуксом открывались, а под Виндой - нет, хотя я использовал средства из стандартной библиотеки.

Для совместимости пришлось переделывать мой класс под использование файловых дескрипторов C, одинаково работающих и в современных Линуксах, и в Видоусах.





вторник, 5 февраля 2008 г.

Skype Video работает под Kubuntu!

Ура, товарищи!
Не знаю, чем это обусловлено (может быть установкой софтины для пользования вебкамерой под названием "Webcam Application"), но сегодня у меня заработало видео в Скайпе! А до этого я читал, что моя вебкамера не поддерживается скайпом, и поэтому ничего для её настройки не предпринимал.

Вуаля!

Free Image Hosting at www.ImageShack.us


P.S. Теперь винда будет только для игр =) Да и те не часто =) Вендекапец, знаете ли.