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