Начиная с 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
, что требует использования интегральные типы одинакового размера вместо