Есть ли строковый класс STL, который правильно обрабатывает Unicode? - PullRequest
13 голосов
/ 01 февраля 2011

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

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

Ответы [ 7 ]

11 голосов
/ 01 февраля 2011

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

9 голосов
/ 01 февраля 2011

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

7 голосов
/ 01 февраля 2011

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

3 голосов
/ 01 февраля 2011

Нет поддержки UTF-8 на STL. В качестве альтернативы вы можете использовать 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;
}
2 голосов
/ 01 февраля 2011

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

2 голосов
/ 01 февраля 2011

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

1 голос
/ 13 февраля 2013

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

...