Поддерживает ли C ++ 0x преобразование std :: wstring в / из байтовой последовательности UTF-8? - PullRequest
8 голосов
/ 07 марта 2009

Я видел, что C ++ 0x добавит поддержку литералов UTF-8, UTF-16 и UTF-32. Но как насчет преобразований между тремя представлениями?

Я планирую использовать std :: wstring везде в моем коде. Но мне также нужно манипулировать данными в кодировке UTF-8 при работе с файлами и сетью. Будет ли C ++ 0x обеспечивать поддержку этих операций?

Ответы [ 2 ]

15 голосов
/ 07 марта 2009

В C ++ 0x, char16_t и char32_t будут использоваться для хранения UTF-16 и UTF-32, а не wchar_t.

Из черновика n2798:

22.2.1.4 Шаблон класса codecvt

2 Класс codecvt предназначен для использования при преобразовании из одного набора кодов в другой, например, из широких символов в многобайтовые символы или между кодировками широких символов, такими как Unicode и EUC.

3 Специализации, требуемые в таблице 76 (22.1.1.1.1), преобразуют реализацию определенный собственный набор символов. Codecvt реализует вырожденный преобразование; это не конвертируется вообще. Специализация codecvt<char16_t, char, mbstate_t> преобразует схемы кодирования UTF-16 и UTF-8 и специализация codecvt <char32_t, char, mbstate_t> конвертирует между UTF-32 и Схемы кодирования UTF-8. codecvt<wchar_t,char,mbstate_t> конвертирует между родными наборы символов для узких и широких символов. Специализации на mbstate_t выполнять преобразование между кодировками известно разработчику библиотеки.

Другие кодировки можно преобразовать, специализируясь на определяемом пользователем типе stateT. Объект stateT может содержать любое состояние, полезное для связи со специализированным do_in или из него. участники do_out.

вещь о wchar_t заключается в том, что она не дает никаких гарантий относительно используемой кодировки. Это тип, который может содержать многобайтовый символ. Период. Если вы собираетесь писать программное обеспечение сейчас , вам придется жить с этим компромиссом. C ++ 0x-совместимые компиляторы еще далеко. Вы всегда можете попробовать компиляторы CTP и g ++ VC2010. Более того, wchar_t имеет разные размеры на разных платформах, на что стоит обратить внимание (2 байта в VS / Windows, 4 байта в GCC / Mac и т. Д.). Затем есть опции типа -fshort-wchar для GCC, чтобы еще больше усложнить проблему.

Поэтому лучшее решение - использовать существующую библиотеку. Погоня за ошибками в Юникоде - не лучшее использование усилий и времени. Я бы посоветовал вам взглянуть на:

Подробнее о строковых литералах C ++ 0x Unicode здесь

0 голосов
/ 09 марта 2009

Спасибо вам с благодарностью. Я еще не зарегистрирован, поэтому я не могу голосовать или отвечать прямо как комментарий.

Я кое-что узнал с codecvt. Я знал о библиотеках, которые вы предлагаете, и следующий ресурс также может быть полезен http://www.unicode.org/Public/PROGRAMS/CVTUTF/.

Проект предназначен для библиотеки с открытым исходным кодом. Я бы предпочел минимизировать зависимости с внешними библиотеками. У меня уже есть зависимость с libgc и boost, хотя для последующих я использую только потоки. Я действительно предпочел бы придерживаться стандарта C ++, и я немного разочарован тем, что поддержка GC как-то упала.

Очевидно, что VC ++ express 2008 поддерживает большую часть стандарта C ++ 0x, а также icc. Поскольку в настоящее время я занимаюсь разработкой с использованием VC ++, и до освобождения библиотеки потребуется еще некоторое время, я хотел бы попробовать использовать строки codecvt и char32_t.

Кто-нибудь знает, как это сделать? Должен ли я опубликовать еще один вопрос?

...