Представляю open-source проект
iculocale — набор основанных на
ICU полностью совместимых со стандартной библиотекой C++ фасеток локализации.
Буду рад любым отзывам и замечаниям.
Особенности:
Язык C++; поддерживает C++03, совместим с C++11.
Открытый исходный код и полностью свободная лицензия (Boost).
Тонкая, легковесная обертка над ICU.
Библиотека может быть собрана как статическая или динамическая, а также может использоваться как библиотека в заголовочных файлах, т. е. без сборки.
В зависимостях библиотеки только ICU (и Boost.Test, если необходимо собрать тесты).
Протестирована с MSVC 2008, 2010 и 2012, а также с GCC под Linux и Cygwin.
Полная совместимость со стандартными фасетками и бесшовная интеграция с C++'ной системой локализации (локали, фасетки, стримы).
Что конкретно входит в состав библиотеки:
Фасетка codecvt для конвертирования символов в различных кодировках, в т. ч.:
— iculocale::codecvt_byname<wchar_t, char, std::mbstate_t> — между wide char и заданной multibyte кодировкой, в обе стороны.
Фасетка collate для сортировки, нормализации (имея в виду последующую сортировку) и хеширования строк:
— iculocale::collate_byname<char>
— iculocale::collate_byname<wchar_t>
Фасетка ctype для классификации и капитализации символов:
— iculocale::ctype_byname<char>
— iculocale::ctype_byname<wchar_t>
Фасетка messages для локализации с использованием каталогов локализованных сообщений:
— iculocale::messages_byname<char>
— iculocale::messages_byname<wchar_t>
Фасетка moneypunct для пунктуации вводимых и выводимых денежных сумм:
— iculocale::moneypunct_byname<char, true>
— iculocale::moneypunct_byname<wchar_t, true>
— iculocale::moneypunct_byname<char, false>
— iculocale::moneypunct_byname<wchar_t, false>
Фасетка numpunct для пунктуации вводимых и выводимых чисел:
— iculocale::numpunct_byname<char>
— iculocale::numpunct_byname<wchar_t>
Вспомогательная перегруженная шаблонная функция make_string() для простой конвертации широких и мультибайтных строк друг в друга с заданной или дефолтной фасеткой или локалью.
Что еще не сделано, но в планах:
Фасетка для ввода-вывода времени
Принципиальные ограничения реализации:
Хотя такие фасетки как codecvt и ctype всегда могут быть созданы для корректных локалей, но, например, фасетка numpunct_byname<char> для "fr_FR.utf8" существует не всегда т. к. разделитель в локали "fr_FR" — no-break-space — не может быть представлен одним символом в UTF-8, как того требует стандарт C++.
Функции iculocale::numpunct_byname<>::truename() и iculocale::numpunct_byname<char>::falsename() всегда возвращают значение по умолчанию, т. к. в ICU таких данных нет.
Функции iculocale::ctype_byname<>::widen() и iculocale::ctype_byname<>::narrow() работают ожидаемым образом только для 7-битных ASCII, что, впрочем, разрешено стандартом.
— Т. к. ICU не описывает различия пунктуации денежных сумм в локальном и интернациональном формате, сейчас они отличаются только знаком валюты (напр., $ для первого и USD для второго).
Все пробельные символы в пунктуации сумм (как правило, это no break space) заменяются на std::money_base::space.
Ссылки:
Проект хостится здесь
Исходный код и документацию (доксигеновое описание классов, несколько семплов, краткий users guide по сборке и использованию) можно скачать здесь.
Также код можно получить из SVN:
svn checkout svn://svn.code.sf.net/p/iculocale/code/tags/last_release iculocale-last_release
Почитать о том что такое локали, фасетки и с чем их едят можно в 3-ем специальном издании "Языка Программирования C++".