C++. Сборник рецептов - [184]

Шрифт
Интервал

.

Пример 14.4. Заголовочный файл xerces_strings.hpp, используемый для выполнения преобразований между строками Xerces и строками со стандартными символами

>#ifndef XERCES_STRINGS_HPP_INCLUDED

>#define XERCES_STRINGS_HPP_INCLUDED


>#include

>#include

>#include


>typedef std::basic_string XercesString;


>// Преобразует строку со стандартными символами

>// в строку с расширенным набором символов

>inline XercesString fromNative(const char* str) {

>boost::scoped_array ptr(xercesc::XMLString::transcode(str));

> return XercesString(ptr.get());

>}


>// Преобразует строку со стандартными символами

>// в строку с расширенным набором символов.

>inline XercesString fromNative(const std::string& str) {

> return fromNative(str.c_str());

>}


>// Преобразует строку с расширенным набором символов

>// в строку со стандартными символами.

>inline std::string toNative(const XMLCh* str) {

>boost::scoped_array ptr(xercesc::XMLString::transcode(str));

> return std::string(ptr.get());

>}


>// Преобразует строку с расширенным набором символов в строку со стандартными символами.

>inline std::string toNative(const XercesString& str) {

> return toNative(str.c_str());

>}


>#endif // #ifndef XERCES_STRINGS_HPP_INCLUDED

Для выполнения преобразований между строками Xerces и >std::wstring просто используйте конструктор >std::basic_string, передавая ему два итератора. Например, можно определить следующие две функции.

>// Преобразует строку Xerces в строку std::wstring

>std::wstring xercesToWstring(const XercesString& str) {

> return std::wstring(str.begin(), str.end());

>}


>// Преобразует строку std::wstring в строку XercesString

>XercesString wstringToXerces(const std::wstring& str) {

> return XercesString(str.begin(), str.end());

>}

В этих функциях используется тот факт, что >wchar_t и >XMLCh являются интегральными типами, каждый из которых может неявно преобразовываться в другой; это должно работать независимо от размера >wchar_t, пока не используются значения, выходящие за диапазон >XMLCh. Вы можете определить подобные функции, принимающие в качестве аргументов строки в C-стиле, используя конструктор >std::basic::string, которому передаются в качестве аргументов массив символов и длина.

Обсуждение

Для представления строк в коде Unicode библиотека Xerces использует последовательности символов >XMLCh, завершаемые нулем. Тип >XMLCh вводится с помощью >typedef как интегральный тип, зависящий от реализации и содержащий не менее 16 бит, которых достаточно для представления символов почти любого языка. Xerces применяет символьную кодировку UTF-16, что подразумевает теоретическую возможность представления некоторых символов в коде Unicode в виде последовательности из нескольких символов >XMLCh; однако практически можно считать, что каждый символ >XMLCh непосредственно представляет один символ в коде Unicode, т.е. имеет числовое значение символа Unicode.

Одно время тип >XMLCh определялся с помощью >typedef как >wchar_t, что позволяло легко сохранять копию строки Xerces как >std::wstring. Однако в настоящее время Xerces определяет >XMLCh на всех платформах с помощью >typedef как >unsigned short. Кроме всего прочего это означает, что на некоторых платформах типы >XMLCh и >wchar_t имеют разный размер. Поскольку Xerces может изменить в будущем определение >XMLCh, нельзя рассчитывать на то, что >XMLCh будет идентичен какому-то конкретному типу. Поэтому, если требуется сохранить копию строки Xerces, следует использовать тип >std::basic_string.

При использовании Xerces вам придется часто выполнять преобразования между строками со стандартными символами и строками Xerces; для этой цели в Xerces предусмотрена перегруженная функция >transcode(). >transcode() может преобразовать строку Unicode в строку со стандартными символами, использующую «родную» кодировку символов, или строку с «родной» кодировкой со стандартными символами в строку Unicode. Однако смысл родной кодировки точно не определен, поэтому если вы программируете в среде, в которой часто используется несколько кодировок символов, то вам придется все взять в свои руки и выполнять преобразования особым образом, используя либо фасет >std::codecvt, либо подключаемые службы перекодировки (pluggable transcoding services) библиотеки Xerces, описанные в документации Xerces. Однако во многих случаях вполне достаточно использовать >transcode().

Память под возвращаемые функцией >transcode() строки, завершающиеся нулем, динамически выделяется при помощи оператора >new в форме массива; вам придется строку удалять самому, используя оператор >delete[]. Это создает небольшую проблему управления памяти, поскольку обычно требуется копировать строку или записывать ее в поток до ее удаления, а эти операции могут выбросить исключение. Я решаю эту проблему в примере 14.4 с помощью шаблона >boost::scoped_array, который динамически выделяет память под массив и автоматически удаляет его при выходе из области видимости, даже если выбрасывается исключение. Например, рассмотрим реализацию функции >fromNative.

>inline XercesString fromNative(const char* str) {


Рекомендуем почитать
Изучаем Java EE 7

Java Enterprise Edition (Java EE) остается одной из ведущих технологий и платформ на основе Java. Данная книга представляет собой логичное пошаговое руководство, в котором подробно описаны многие спецификации и эталонные реализации Java EE 7. Работа с ними продемонстрирована на практических примерах. В этом фундаментальном издании также используется новейшая версия инструмента GlassFish, предназначенного для развертывания и администрирования примеров кода. Книга написана ведущим специалистом по обработке запросов на спецификацию Java EE, членом наблюдательного совета организации Java Community Process (JCP)


Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


Фундаментальные алгоритмы и структуры данных в Delphi

Книга "Фундаментальные алгоритмы и структуры данных в Delphi" представляет собой уникальное учебное и справочное пособие по наиболее распространенным алгоритмам манипулирования данными, которые зарекомендовали себя как надежные и проверенные многими поколениями программистов. По данным журнала "Delphi Informant" за 2002 год, эта книга была признана сообществом разработчиков прикладных приложений на Delphi как «самая лучшая книга по практическому применению всех версий Delphi».В книге подробно рассматриваются базовые понятия алгоритмов и основополагающие структуры данных, алгоритмы сортировки, поиска, хеширования, синтаксического разбора, сжатия данных, а также многие другие темы, тесно связанные с прикладным программированием.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.


Как пасти котов. Наставление для программистов, руководящих другими программистами

«Как пасти котов» – это книга о лидерстве и руководстве, о том, как первое совмещать со вторым. Это, если хотите, словарь трудных случаев управления IT-проектами. Программист подобен кошке, которая гуляет сама по себе. Так уж исторически сложилось. Именно поэтому так непросто быть руководителем команды разработчиков. Даже если вы еще месяц назад были блестящим и дисциплинированным программистом и вдруг оказались в роли менеджера, вряд ли вы знаете, с чего надо начать, какой выбрать стиль руководства, как нанимать и увольнять сотрудников, проводить совещания, добиваться своевременного выполнения задач.