UTF-16 codecvt фасет - PullRequest
       117

UTF-16 codecvt фасет

3 голосов
/ 17 декабря 2009

Отступая от этого вопроса о locales
И описанный в этот вопрос : что я действительно хотел сделать, это установить фасет codecvt в локаль, которая понимает файлы UTF-16.

Я мог бы написать свой собственный. Но я не эксперт по UTF, и поэтому уверен, что получу это почти правильно; но это сломалось бы в самое неудобное время. Поэтому мне было интересно, есть ли какие-либо ресурсы (в Интернете) предварительно собранных фасетов codecvt (или других), которые можно использовать из C ++, которые рецензируются и тестируются?

Причиной является локаль по умолчанию (в моей системе MAC OS X 10.6), когда чтение файла просто конвертирует 1 байт в 1 wchar_t без преобразования. Таким образом, файлы в кодировке UTF-16 преобразуются в строки wstring, содержащие много нулевых ('\ 0') символов.

Ответы [ 2 ]

2 голосов
/ 17 декабря 2009

Я не уверен, что под "ресурсами в Интернете" вы подразумевали доступность бесплатно, но есть Библиотека конверсий Dinkumware , которая звучит так, как будто она соответствует вашим потребностям - при условии, что библиотека может быть интегрирована в ваш пакет компиляторов.

Типы codecvt описаны в разделе Преобразования кода .

0 голосов
/ 28 декабря 2016

Начиная с C ++ 11, существуют дополнительные стандартные codecvt специализации и типы, предназначенные для преобразования между различными последовательностями символов UTF- x и UCS x ; один из них может удовлетворить ваши потребности.

В <locale>:

  • std::codecvt<char16_t, char, std::mbstate_t>: преобразование между UTF-16 и UTF-8.
  • std::codecvt<char32_t, char, std::mbstate_t>: преобразование между UTF-32 и UTF-8.

В <codecvt>:

  • std::codecvt_utf8_utf16<typename Elem>: преобразует между UTF-8 и UTF-16, где кодовые точки UTF-16 сохраняются как указанные Elem (обратите внимание, что если указано char32_t, для каждой * будет сохраняться только одна кодовая точка) 1026 *).
    • Имеет два дополнительных параметра по умолчанию (unsigned long MaxCode = 0x10ffff и std::codecvt_mode Mode = (std::codecvt_mode)0) и наследуется от std::codecvt<Elem, char, std::mbstate_t>.
  • std::codecvt_utf8<typename Elem>: преобразует между UTF-8 и UCS2 или UCS4, в зависимости от Elem (UCS2 для char16_t, UCS4 для char32_t, платформенно-зависимый для wchar_t).
    • Имеет два дополнительных параметра по умолчанию (unsigned long MaxCode = 0x10ffff и std::codecvt_mode Mode = (std::codecvt_mode)0) и наследуется от std::codecvt<Elem, char, std::mbstate_t>.
  • std::codecvt_utf16<typename Elem>: преобразует между UTF-16 и UCS2 или UCS4, в зависимости от Elem (UCS2 для char16_t, UCS4 для char32_t, платформенно-зависимый для wchar_t).
    • Имеет два дополнительных параметра по умолчанию (unsigned long MaxCode = 0x10ffff и std::codecvt_mode Mode = (std::codecvt_mode)0) и наследуется от std::codecvt<Elem, char, std::mbstate_t>.

codecvt_utf8 и codecvt_utf16 будут преобразовывать между указанным UTF и UCS2 или UCS4, в зависимости от размера Elem. Поэтому wchar_t будет указывать UCS2 в системах где он от 16 до 31 бита (например, Windows, где он 16-битный) или UCS4 в системах, где он по крайней мере 32-битный (например, Linux, где он 32-битный), независимо от того, wchar_t строки на самом деле использовать эту кодировку; на платформах, которые используют разные кодировки для строк wchar_t, это может вызвать проблемы, если вы не будете осторожны.

Для получения дополнительной информации см. CPP Reference:

Обратите внимание, что поддержка заголовка codecvt была добавлена ​​в libstdc++ только относительно недавно. Если вы используете старую версию Clang или GCC, вам, возможно, придется использовать libc++, если вы хотите его использовать.
Обратите внимание, что версии Visual Studio до 2015 года на самом деле не поддерживают char16_t и char32_t; если эти типы существуют в предыдущих версиях, они будут как typedefs для unsigned short и unsigned int соответственно. Также обратите внимание, что в старых версиях Visual Studio иногда возникают проблемы с преобразованием строк между кодировками UTF, и что Visual Studio 2015 имеет ошибку, которая не позволяет codecvt работать должным образом с char16_t и char32_t, что требует использования интегральные типы одинакового размера вместо

...