Есть ли класс строк STL, который правильно обрабатывает Unicode?

Я знаю все о std::string и std:: wstring, но они, похоже, не полностью обращают внимание на расширенную кодировку символов UTF-8 и UTF-16 (по крайней мере на окнах). Поддержка UTF-32 также не поддерживается.

Знает ли кто-нибудь о кросс-платформенных классах замены, которые обеспечивают полную поддержку UTF-8, UTF-16 и UTF-32?

Ответы

Ответ 1

Ну в С++ 0x есть классы std:: u32string и std:: u16string. GCC уже частично поддерживает их, поэтому вы уже можете их использовать, но поддержка потоков для unicode еще не выполнена Поддержка Unicode в С++ 0x.

Ответ 2

И пусть не забудет легкую, очень удобную, только для заголовка UTF-8 библиотеку UTF8-CPP. Не заменяемая замена, но ее можно легко использовать в сочетании с std::string и не имеет внешних зависимостей.

Ответ 3

Это не STL, но если вам нужен правильный Unicode на С++, вы должны взглянуть на ICU.

Ответ 4

В STL нет поддержки UTF-8. В качестве альтернативы вы можете использовать boost codecvt:

//...
// My encoding type
typedef wchar_t ucs4_t;

std::locale old_locale;
std::locale utf8_locale(old_locale,new utf8_codecvt_facet<ucs4_t>);

// Set a New global locale
std::locale::global(utf8_locale);

// Send the UCS-4 data out, converting to UTF-8
{
    std::wstringstream oss;
    oss.imbue(utf8_locale);
    std::copy(ucs4_data.begin(),ucs4_data.end(),
        std::ostream_iterator<ucs4_t,ucs4_t>(oss));

    std::wcout << oss.str() << std::endl;
}

Ответ 5

Для поддержки UTF-8 существует класс Glib:: ustring. Он моделируется после std::string, но знает utf-8, например. когда вы сканируете строку с помощью итератора. Он также имеет некоторые ограничения, например. итератор всегда const, так как замена символа может изменить длину строки, и поэтому она может аннулировать другие итераторы.

ustring автоматически не преобразует другие кодировки в библиотеку utf-8, Glib для этого используются различные функции преобразования. Вы можете проверить, является ли строка допустимым utf-8, хотя.

А также ustring и std::string взаимозаменяемы, т.е. ustring имеет оператор трансляции std::string, поэтому вы можете передать ustring в качестве параметра, где ожидается std::string, и наоборот конечно, поскольку ustring можно построить из std::string.

Ответ 6

Qt имеет QString, который использует UTF-16 внутренне, но имеет методы для преобразования в или из std:: wstring, UTF-8, Latin1 или кодировка локали. Существует также класс QTextCodec, который может конвертировать QStrings в или из чего угодно. Но использование Qt только для строк кажется для меня излишним.