ПРИВЕТ МИР! - как это вывести в unicode????

Все о программировании под *nix
Аватара пользователя
hlamer
Увлекающийся
Сообщения: 119
Зарегистрирован: 24 фев 2006, 23:34

ПРИВЕТ МИР! - как это вывести в unicode????

Сообщение hlamer »

Вот такая задачка:
В Linux (kubuntu 5.10 полностью обновленная )
пытаюсь вывести "Привет, мир!" в Unicode с помощью wcout (поток вывода для юникода). Получаю кракозяблы.

Код: Выделить всё

#include <stdio>
#include <iostream>
#include    <locale>

int main ()
{ 
std::locale loc(""); 
loc = wcout.getloc();
cout<< endl<< loc.name()<<endl;   //выводим имя локали
wcout << L"Привет, мир!(world)" << endl; // вот так по идее работать не должно, должны быть кракозяблы

wcout.imbue(std::locale("") ); // меняем локаль на локаль системы
loc = wcout.getloc();
cout<< endl<< loc.name()<<endl; //выводим имя локали
wcout << L"Привет, мир!(world)" << endl; // вот сдесь должен был быть текст!!!!!

wcout.imbue(std::locale("ru_RU.KOI8-R") );
loc = wcout.getloc();
cout<< endl<< loc.name()<<endl;
wcout << L"Привет, мир!(world)" << endl; // а вот сдесь должны были быть кракозяблы, но уже не такие
}
Получаю вывод

Код: Выделить всё

 

C
@825B, <8@!(world)

ru_RU.UTF-8
@825B, <8@!(world)

ru_RU.KOI8-R
@825B, <8@!(world)
Локаль системы ru_RU.UTF-8
Используется gcc version 4.0.2 20050808 (prerelease) (Ubuntu 4.0.1-4ubuntu9)
Исходный файл в кодировке utf-8 (если сохранить в koi например, компилятор ругается и не компилирует)

С помощью google нашел кучу ссылок с описанием проблемы, но без решений, и ссылки на

http://gcc.gnu.org/ml/gcc-bugs/2004-03/msg02144.html
http://lists.debian.org/debian-gcc/2002 ... 00049.html
... а так же упоминание о том, что баг был в gcc 3.3 и к gcc 3.4 уже исправлен.

А сейчас собственно вопросы:
Это действительно баг gcc, или, что более вероятно, у меня руки кривые?
В каком месте кривые?
Как более менее красиво вывести unicode на консоль?
Заранее спасибо
И сошел на него Дух Господень...
Нашел он свежую ослиную челюсть, и,
протянув руку свою, взял ее,
и убил ею тысячу человек.
Книга Судей, глава 15, стих 14, 15

Аватара пользователя
fa3a
Неотъемлемая часть форума
Сообщения: 619
Зарегистрирован: 25 июл 2003, 17:22
Откуда: Minsk

Сообщение fa3a »

под RHEL4 U2 после изменения кода данного примера на

Код: Выделить всё

cout.imbue(std::locale("") ); // меняем локаль на локаль системы
loc = cout.getloc();
cout<< endl<< loc.name()<<endl; //выводим имя локали
cout << "Привет, мир!(world)" << endl; // вот сдесь должен был быть текст!!!!!
смог вывести в gnome-terminale под локалью ru_RU.utf8 и установкой кодировки gnome-terminala на windows-1251..

Код: Выделить всё

[pasha@rhcl01 aa]$ ./dir

C
, !(world)

ru_RU.utf8
Привет, мир!(world)

ru_RU.KOI8-R
Привет, мир!(world)
Never touch the running program!!!

Аватара пользователя
fa3a
Неотъемлемая часть форума
Сообщения: 619
Зарегистрирован: 25 июл 2003, 17:22
Откуда: Minsk

Сообщение fa3a »

а вообще говоря похоже в твоем примере проблема с формированием multibyte-ной строки:

Код: Выделить всё

mbstowcs: Invalid or incomplete multibyte or wide character
т.е. я попробовал сам сконвертировать char в wchar_t посредством mbstowcs..
Never touch the running program!!!

serge
Заглянувший
Сообщения: 22
Зарегистрирован: 13 фев 2006, 17:22

Сообщение serge »

Конструкция вида L"чего-то-там" в C/C++ работает только для ASCII текста.

Аватара пользователя
hlamer
Увлекающийся
Сообщения: 119
Зарегистрирован: 24 фев 2006, 23:34

Сообщение hlamer »

serge писал(а):Конструкция вида L"чего-то-там" в C/C++ работает только для ASCII текста.
Возможно
Попробовал загружать строку в юникоде из правильно сохраненного файла. Тоже фигня. В общем забил и использую cout как в сообщении fa3a.
Как-нить будет настроение, еще повожусь.

Спасибо

(кстати, если у кого получится выудить русские буквы из wcout - напишите как)
И сошел на него Дух Господень...
Нашел он свежую ослиную челюсть, и,
протянув руку свою, взял ее,
и убил ею тысячу человек.
Книга Судей, глава 15, стих 14, 15

Аватара пользователя
fa3a
Неотъемлемая часть форума
Сообщения: 619
Зарегистрирован: 25 июл 2003, 17:22
Откуда: Minsk

Сообщение fa3a »

hlamer, советую сходить по линку http://www.cl.cam.ac.uk/~mgk25/unicode.html .. Очень все толково и подробно расписано про UTF-8..
Never touch the running program!!!

Аватара пользователя
hlamer
Увлекающийся
Сообщения: 119
Зарегистрирован: 24 фев 2006, 23:34

Сообщение hlamer »

В общем формулирую решение задачки вывода текста в unicode utf8

Привести вывод к локали системы с помощью

Код: Выделить всё

setlocale(LC_ALL, ""); 
(функции смены локали потоков ввода-вывода почему-то не дают эффекта)
Далее выводить текст с помощью строчки

Код: Выделить всё

wcout << L"Привет, мир!(world)" << endl;
Не использовать cout, printf Вообще
Если нужно вывести однобайтный текст - преобразовываем к utf8 функцией...

Код: Выделить всё

wchar_t wname[10];
std::string str ("hello  - привет");
mbstowcs ( &wname[0], & (str= loc.name())[0]   ,10); 
(заголовочный файл <cstdlib>, последний параметр - максимальное число элементов в строке расширенных символов)

Код: Выделить всё

#include <cstdio> 
#include <iostream> 
#include <string>
 
 int main () 
 { 
 
setlocale(LC_ALL, ""); 

wcout << L"Привет, мир!(world)" << endl; 
 
std::string str  = "Привет";
wchar_t wname[10];
mbstowcs ( &wname[0], &str[0]   ,10);
wcout<<wname<<endl;
 
 }
Спасибо fa3a и Aleksey Kondratenko
И сошел на него Дух Господень...
Нашел он свежую ослиную челюсть, и,
протянув руку свою, взял ее,
и убил ею тысячу человек.
Книга Судей, глава 15, стих 14, 15

Аватара пользователя
dojlid
Маньяк
Сообщения: 169
Зарегистрирован: 30 апр 2004, 12:19
Откуда: Miensk, Belarus
Контактная информация:

Сообщение dojlid »

Адпачатку пастаноўка задачы памылковая, што за кірылічны тэкст у кодзе??? .... жахліва.
man 3 gettext

P.S. хаця калі захацелася дзіўнага... :D
Z pažadańnem pośpexaŭ, VX.
JID: dojlid@jabber.org
JID: vk@altlinux.org

Ответить