Преобразование кодировок и типов

Преобразовать строки типов wstring, u16string и u32string в строку типа string и наоборот, позволяет класс wstring_convert. Создать экземпляр класса можно, например, так:

// #include <locale>
std::wstring_convert<Тип1, Тип2> convert;

Вместо Тип1 указывается объект (фасет), выполняющий преобразование (полный список смотрите в документации):

#include <codecvt>
std::codecvt_utf8_utf16<char16_t> // UTF-8 <-> UTF-16
std::codecvt_utf8<char16_t>    // UTF-8 <-> UCS-2
std::codecvt_utf8<wchar_t>     // UTF-8 <-> UCS-2 (sizeof(wchar_t) == 2)
std::codecvt_utf8<char32_t>    // UTF-8 <-> UTF-32
std::codecvt_utf16<char16_t>   // UTF-16 <-> UCS-2
std::codecvt_utf16<char32_t>   // UTF-16 <-> UTF-32

Вместо Тип2 указывается тип данных символа внутри строки.

Для преобразования используются следующие методы из класса wstring_convert:

  • to_bytes() — возвращает объект класса string с данными в заданной кодировке. Прототипы метода:
byte_string to_bytes(_Elem ch);
byte_string to_bytes(const _Elem *str);
byte_string to_bytes(const _Elem *first, const _Elem *last);
byte_string to_bytes(const wide_string &str);
typedef basic_string<char, char_traits<char>,
                     allocator<char> >   byte_string;
typedef basic_string<_Elem, char_traits<_Elem>,
                     allocator<_Elem> > wide_string;

Преобразуем объект класса u16string в объект класса string в кодировке UTF-8:

// #include <locale>
// #include <codecvt>
// u16string -> string (UTF-8)
std::wstring_convert<std::codecvt_utf8_utf16<char16_t>,
                     char16_t> convert;
std::u16string u16str(u"строка str");
std::string str_utf8 = convert.to_bytes(u16str);
for (char &ch : str_utf8) {
   std::cout << (int)ch << ' ';
}
// -47 -127 -47 -126 -47 -128 -48 -66 -48 -70 -48 -80
// 32 115 116 114
std::cout << std::endl;
  • from_bytes() — преобразует строку в многобайтовой кодировке в объекты классов wstring, u16string или u32string. Прототипы метода:
wide_string from_bytes(char ch);
wide_string from_bytes(const char *str);
wide_string from_bytes(const char *first, const char *last);
wide_string from_bytes(const byte_string &str);

Преобразуем объект класса string в кодировке UTF-8 в объект класса u32string:

// string (UTF-8) -> u32string
std::wstring_convert<std::codecvt_utf8<char32_t>,
                     char32_t> convert;
std::string str_utf8(u8"строка str");
std::u32string u32str = convert.from_bytes(str_utf8);
for (char32_t &ch : u32str) {
   std::cout << ch << ' ';
} // 1089 1090 1088 1086 1082 1072 32 115 116 114
std::cout << std::endl;

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов