UTF8 + идентификатор кода символов + С++
От: Crackjack Россия  
Дата: 21.05.09 06:32
Оценка:
Мне известно, что в структуре находится UTF8 строка. Так же известен идентификатор набора символов в соответствии с IBM CCSID(У меня он 866). Как мне средствами С++ вывести строку на консоль?

21.05.09 12:51: Перенесено модератором из 'C/C++' — Кодт
Re: UTF8 + идентификатор кода символов + С++
От: Кодт Россия  
Дата: 21.05.09 09:05
Оценка: 1 (1) +1
Здравствуйте, Crackjack, Вы писали:

C>Мне известно, что в структуре находится UTF8 строка. Так же известен идентификатор набора символов в соответствии с IBM CCSID(У меня он 866). Как мне средствами С++ вывести строку на консоль?


Воспользоваться любыми средствами преобразования кодировок — стандартная mbstowc/wcstomb, винапишная MultiByteToWideChar/WideCharToMultiByte, портабельная libiconv.
Но раз тебе нужно вывести в досовской кодировке, полагаю, что это всё же не дос, а консоль виндоуза.
const char* str_utf8 = "........";

size_t const count_utf16 = MultiByteToWideChar(CP_UTF8, 0, src_utf8, -1, NULL, 0); // включает концевой ноль
std::vector<wchar_t> str_utf16(count_utf16);
MultiByteToWideChar(CP_UTF8, 0, str_utf8, -1, &str_utf16.front(), count_utf16);

unsigned const codepage = 866; // или CP_OEM - это алиас досовской кодировки пользователя
size_t const count_cp866 = WideCharToMultiByte(codepage, 0, &str_utf8.front(), -1, NULL, 0, "?", NULL); // опять включая концевой ноль
std::vector<char> str_cp866(count_cp866);
WideCharToMultiByte(codepage, 0, &str_utf8.front(), -1, &str_cp866.front(), count_866, "?", NULL);

std::cout << &str_cpp866.front();


Если используешь MFC/ATL/WTL, то вместо std::vector удобнее пользоваться CStringA, CStringW и хелпером CStrBufA/W соответственно.
... << RSDN@Home 1.2.0 alpha 4 rev. 1207>>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.