Есть ли класс 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 родной.