Страницы

Поиск по вопросам

среда, 22 мая 2019 г.

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

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


Ответ

Однако, мне нужна строка в 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 #include #include #include
int main() { std::wstring_convert < std::codecvt_utf8_utf16, char16_t> convert;
const char *s = "еёЁжикЕст"; std::cout << "Input: " << s << "
"; std::u16string str = convert.from_bytes(s); for (int q=0; s[q]; ++q) std::cout << (int)s[q] << ' '; std::cout << '
'; for (int q=0; q'; }

Комментариев нет:

Отправить комментарий