Преобразовать ICU UnicodeString в зависящий от платформы char * (или std::string)

В моем приложении я использую ICU UnicodeString для хранения своих строк. Поскольку я использую некоторые библиотеки, несовместимые с ICU, мне нужно преобразовать UnicodeString в его представление, зависящее от платформы.

По сути, мне нужно сделать обратную форму процесса, создающую новый объект UnicodeString - new UnicodeString ("строка, закодированная в локали системы").

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

Итак, мой ответ: можно ли это сделать каким-то другим более простым способом, без использования строкового потока для преобразования?


person Trakhan    schedule 08.12.2010    source источник
comment
Почему вы не хотите использовать stringstream?   -  person Karl Knechtel    schedule 08.12.2010
comment
Здесь есть скрытое предположение, что существует 8-битное представление, зависящее от платформы. Это уже неверно для Windows, где 8-битные представления зарезервированы для устаревших (Windows 95) приложений. По этой причине там нет необходимости поддерживать UTF-8: 15-летние приложения не ожидают Unicode, а более современные (NT) приложения будут использовать собственный UTF-16.   -  person MSalters    schedule 08.12.2010
comment
Ряд Unix используют UTF-8 для кодирования строк.   -  person Donal Fellows    schedule 08.12.2010
comment
@Donal: Ваша точка зрения? @MSalters: Многим приложениям Windows по-прежнему необходимо использовать UTF-8. Например, спецификации HTML/XML определяются с его точки зрения, как и многие форматы данных. Формат на диске часто имеет формат UTF-8, даже если приложение использует кодировку UTF-16 внутри.   -  person Billy ONeal    schedule 08.12.2010
comment
@Billy ONeal: Конечно, UTF-8 существует даже в Windows. Но это никогда не зависит от платформы или CP_ACP, как это известно в Windows.   -  person MSalters    schedule 08.12.2010
comment
Karl Knechtel - дело не в том, что я не хочу использовать stringstream, мне было довольно любопытно, единственный ли это способ...   -  person Trakhan    schedule 08.12.2010
comment
другие: я не хочу принимать какую-либо кодировку. Я говорил UTF-8, потому что в настоящее время я разрабатываю Linux, где он используется.   -  person Trakhan    schedule 08.12.2010
comment
@Trakhan: Пожалуйста, укажите, хотите ли вы быть независимыми от платформы или нет, потому что ответ зависит от платформы, как объяснил MSalters. В Windows преобразование в представление, зависящее от платформы, является преобразованием идентификатора — и UnicodeString ICU, и Windows используют UTF-16 в качестве собственного представления.   -  person Philipp    schedule 08.12.2010


Ответы (3)


Вы можете использовать UnicodeString::extract() с кодовой страницей (или преобразователь). На самом деле передача NULL для кодовой страницы будет использовать то, что ICU определило как кодовую страницу по умолчанию.

person Steven R. Loomis    schedule 08.12.2010
comment
Ааа, это то, что я искал. - person Trakhan; 09.12.2010

я использую

std::string converted;
us.toUTF8String(converted);

мы (ICU) UnicodeString

person CWTstackoverflow    schedule 10.02.2015

Вы можете использовать функции из ucnv.h, а именно void ucnv_fromUnicode (UConverter *converter, char **target, const char *targetLimit, const UChar **source, const UChar *sourceLimit, int32_t *offsets, UBool flush, UErrorCode *err). Это не такой хороший C++ API, как UnicodeString, но он будет работать.

Я бы рекомендовал просто придерживаться operator<<, который вы уже используете, если это вообще возможно. В любом случае это стандартный способ обработки лексических преобразований (т.е. преобразования строки в/из целых чисел) в C++.

person Billy ONeal    schedule 08.12.2010