Проблемы с кодировкой на ideone

276
30 мая 2017, 02:43

Как известно, ideone компилирует исходники на Си++ в utf8. Однако, мне нужна строка в utf16 (wstring). Попытался сконвертировать, но получилось что-то не то (причём конвертация из wstring в utf8 работает верно):

wstring_convert < codecvt_utf8_utf16 <wchar_t>, wchar_t> convert;
const char *s = "еёЁжикЕст";
wstring str = convert.from_bytes(s);
for (int q=0; s[q]; ++q) cout << (int)s[q] << ' ';
cout << endl;
for (int q=0; q<str.length(); ++q) cout << (int)str[q] << ' ';
cout << endl;
-48 -75 -47 -111 -48 -127 -48 -74 -48 -72 -48 -70 -48 -107 -47 -127 -47 -126 
13572 20740 260 13828 14340 14852 5380 16644 16900 

но должно было получиться

1077 1105 1025 1078 1080 1082 1045 1089 1090

Вот проверка:

var s = decodeURIComponent( 
  "-48 -75 -47 -111 -48 -127 -48 -74 -48 -72 -48 -70 -48 -107 -47 -127 -47 -126" 
  .split(" ").map(x => "%" + (x & 255).toString(16)).join("") 
) 
 
console.log(s) 
console.log(s.split("").map(ch => ch.charCodeAt(0)).join(" "))

К тому же, если сделать

wchar_t bin[] = {1077, 1105, 1025, 1078, 1080, 1082, 1045, 1089, 1090, 0};
str = bin;
cout << convert.to_bytes(str.c_str()) << endl;

то вывод верный.

Код полностью: http://ideone.com/ut7Nsg

Answer 1

Однако, мне нужна строка в utf16 (wstring).

Это неверно, кодировка std::wstring в стандарте не указана, на Windwows/MSVC sizeof(wchar_t) 2, и там кодировка utf-16, на Linux/gcc sizeof(wchar_t) 4 и кодировка utf-32, ideone использует gcc, отсюда очевидные проблемы, переносимый способ получить код в utf-16 (c++11):

#include <locale>
#include <codecvt>
#include <iostream>
#include <cstdint>
int main() {
    std::wstring_convert < std::codecvt_utf8_utf16<char16_t>, char16_t> convert;
    const char *s = "еёЁжикЕст";
    std::cout << "Input: " << s << "\n";
    std::u16string str = convert.from_bytes(s);
    for (int q=0; s[q]; ++q)
        std::cout << (int)s[q] << ' ';
    std::cout << '\n';
    for (int q=0; q<str.length(); ++q)
        std::cout << (int)str[q] << ' ';
    std::cout << '\n'; 
}
READ ALSO
Как обрезать полное ФИО до инициалов в с++

Как обрезать полное ФИО до инициалов в с++

В программе предусмотрен ввод ФИОЯ не знаю как реализовать, так, что бы вводилось иванов иван иванович, а на выходе получалось Иванов И

261
Поиск объединения промежутков

Поиск объединения промежутков

Мне нужен именно алгоритм

256
Критические секции. C++

Критические секции. C++

Здраствуйте, как правильно поставить критическую секцию в такой функции?

196
Header файлы и их проблема подключения

Header файлы и их проблема подключения

Работаю над проектом с компилятором MinGW32, компилирую в cmdexe и столкнулся с проблемой: Создал header-файл(UIClass

263