Аспект кодека UTF-16

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

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

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


person Martin York    schedule 17.12.2009    source источник


Ответы (2)


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

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

person seh    schedule 17.12.2009
comment
Ссылки уже мертвы. Страницы были перемещены в другое место или они полностью исчезли? - person wilx; 07.06.2012
comment
По прошествии многих лет похоже, что они закрыли доступ к тому, что было общедоступной документацией для их библиотек. Это печально, так как это был отличный ресурс для изучения. - person seh; 08.06.2012

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

In <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.

In <codecvt>:

  • std::codecvt_utf8_utf16<typename Elem>: Converts between UTF-8 and UTF-16, where UTF-16 code points are stored as the specified Elem (note that if char32_t is specified, only one code point will be stored per char32_t).
    • Has two additional, defaulted template paramters (unsigned long MaxCode = 0x10ffff, and std::codecvt_mode Mode = (std::codecvt_mode)0), and inherits from std::codecvt<Elem, char, std::mbstate_t>.
  • std::codecvt_utf8<typename Elem>: Converts between UTF-8 and either UCS2 or UCS4, depending on Elem (UCS2 for char16_t, UCS4 for char32_t, platform-dependent for wchar_t).
    • Has two additional, defaulted template paramters (unsigned long MaxCode = 0x10ffff, and std::codecvt_mode Mode = (std::codecvt_mode)0), and inherits from std::codecvt<Elem, char, std::mbstate_t>.
  • std::codecvt_utf16<typename Elem>: Converts between UTF-16 and either UCS2 or UCS4, depending on Elem (UCS2 for char16_t, UCS4 for char32_t, platform-dependent for wchar_t).
    • Has two additional, defaulted template paramters (unsigned long MaxCode = 0x10ffff, and std::codecvt_mode Mode = (std::codecvt_mode)0), and inherits from std::codecvt<Elem, char, std::mbstate_t>.

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

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

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

person Justin Time - Reinstate Monica    schedule 27.12.2016