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

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

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

7 ответов


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


и давайте не будем забывать о легкой, очень удобной, только для заголовков библиотеке UTF-8 UTF8 ПО-НКЛ. Не drop-in замена, но может легко использоваться в сочетании с std::string и не имеет внешних зависимостей.


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


нет поддержки UTF-8 на STL. В качестве альтернативы вы можете использовать увеличить 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;
}

для поддержки 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.


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


Также посмотрите на http://grigory.info/UTF8Strings.About.html это utf8 родной.