тысячапервый раз про Юникод
От: Аноним  
Дата: 07.10.09 13:33
Оценка:
Добрый день.

Есть BCB60. Есть Win2000. И есть такой код:


#include <iostream.h>

void main(){
std::wcout<<L"hello\n\r";
}



Этот код компилится, линкуется, выполняется, но ничего не печатает .

Вопрос:

1. Как вывести хотя бы английское сообщение в Юникоде в стандартный поток в Win2000?

Спасибо
Re: тысячапервый раз про Юникод
От: catBasilio  
Дата: 07.10.09 15:06
Оценка: -2
Здравствуйте, Аноним, Вы писали:

А>
А>#include <iostream.h>

А>void main(){
А>std::wcout<<L"hello\n\r";
А>}
А>


std::wcout<<L"hello\n\r" << std::endl;


endl кроме перевода строки еще и буфер опорожняет.
UNIX way — это когда тебе вместо туалетной бумаги дают топор, рубанок и карту близлежащего леса
Re[2]: тысячапервый раз про Юникод
От: pepsicoca  
Дата: 07.10.09 15:38
Оценка: :))
Здравствуйте, catBasilio, Вы писали:

B>Здравствуйте, Аноним, Вы писали:


А>>
А>>#include <iostream.h>

А>>void main(){
А>>std::wcout<<L"hello\n\r";
А>>}
А>>


B>
B>std::wcout<<L"hello\n\r" << std::endl;
B>


B>endl кроме перевода строки еще и буфер опорожняет.


Так тоже не работает. Может у меня винда битая? Винда не переставлялась лет пять, но у нас довольно сильный IT отдел и в винде стоят все апдейты по самое немогу. Может какой-то апдейт отрубил wcout? Кроме этого в винде вроде все работает и даже не особенно часто она виснет. Было у кого-то что-то подобное?

Спасибо
Re[2]: тысячапервый раз про Юникод
От: byleas  
Дата: 07.10.09 15:50
Оценка:
Здравствуйте, catBasilio, Вы писали:

B>endl кроме перевода строки еще и буфер опорожняет.

Разве в деструкторе не должен быть сброс буфера? По-моему, должен.
Re: тысячапервый раз про Юникод
От: Rakafon Украина http://rakafon.blogspot.com/
Дата: 07.10.09 16:14
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Этот код компилится, линкуется, выполняется, но ничего не печатает :-(.

wcout.imbue(std::locale("rus_rus.866"));
"Дайте мне возможность выпускать и контролировать деньги в государстве и – мне нет дела до того, кто пишет его законы." (c) Мейер Ансельм Ротшильд , банкир.
Re: тысячапервый раз про Юникод
От: Rakafon Украина http://rakafon.blogspot.com/
Дата: 07.10.09 16:21
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Этот код компилится, линкуется, выполняется, но ничего не печатает :-(.

int _tmain(int argc, _TCHAR* argv[])
{
    std::string localeName = std::locale("").name();
    setlocale(LC_ALL, localeName.c_str());
    std::cout << "Using console locale: " << localeName << std::endl;

    std::wcout.imbue(std::locale(localeName.c_str()));
    std::wcout << L"Хачу чаю аж кончаю!!!" << std::endl;

    return 0;
}
"Дайте мне возможность выпускать и контролировать деньги в государстве и – мне нет дела до того, кто пишет его законы." (c) Мейер Ансельм Ротшильд , банкир.
Re: тысячапервый раз про Юникод
От: Alca Украина  
Дата: 07.10.09 16:46
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Добрый день.


А>Есть BCB60. Есть Win2000. И есть такой код:



А>
А>#include <iostream.h>

А>void main(){
А>std::wcout<<L"hello\n\r";
А>}
А>



А>Этот код компилится, линкуется, выполняется, но ничего не печатает .


А>Вопрос:


А>1. Как вывести хотя бы английское сообщение в Юникоде в стандартный поток в Win2000?


А>Спасибо

А что шестерка держит юникод?
Re[3]: тысячапервый раз про Юникод
От: Pavel Dvorkin Россия  
Дата: 08.10.09 02:58
Оценка: 2 (2) +1
Здравствуйте, pepsicoca, Вы писали:

P>Так тоже не работает. Может у меня винда битая? Винда не переставлялась лет пять, но у нас довольно сильный IT отдел и в винде стоят все апдейты по самое немогу. Может какой-то апдейт отрубил wcout?


Если действительно хочешь чему-то научиться, то как минимум на год выкинь из головы даже мысль о том, что в твоих проблемах виноват кто-то, кроме тебя. Я серьезно говорю.
With best regards
Pavel Dvorkin
Re: тысячапервый раз про Юникод
От: MasterZiv СССР  
Дата: 08.10.09 05:41
Оценка:
Аноним 1 пишет:

> Этот код компилится, линкуется, выполняется, но ничего не печатает .


Оно наверняка печатает, только консоль это не отображает.

Тебе нужно консоль в UCS-2 для этого иметь, и в ней программу свою
запускать.

я не знаю, есть ли в винде консоль с поддержкой UCS-2 .
Возможно, можно в стандартной консоли поставить какую-то
кодировку через

chcp
Posted via RSDN NNTP Server 2.1 beta
Re[3]: тысячапервый раз про Юникод
От: MasterZiv СССР  
Дата: 08.10.09 05:43
Оценка:
pepsicoca пишет:

> B>std::wcout<<L"hello\n\r" << *std::endl*;

> B>
>
>
>
> B>endl кроме перевода строки еще и буфер опорожняет.
>
> Так тоже не работает. Может у меня винда битая? Винда не переставлялась

По выходу из приложения удаляется объект std::wcout, вызывается
его деструктор, закрывается поток, и буфера опорожняются.

Так что тут std::endl или flush звать не обязательно,
ничего не изменится.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: тысячапервый раз про Юникод
От: pepsicoca  
Дата: 08.10.09 07:28
Оценка:
Здравствуйте, Alca, Вы писали:

A>А что шестерка держит юникод?


Судя по тому, что это линкуется, должна держать.
Re[2]: тысячапервый раз про Юникод
От: pepsicoca  
Дата: 08.10.09 07:34
Оценка:
Здравствуйте, Rakafon, Вы писали:

R>Здравствуйте, Аноним, Вы писали:

А>>Этот код компилится, линкуется, выполняется, но ничего не печатает .

R>
R>int _tmain(int argc, _TCHAR* argv[])
R>{
R>    std::string localeName = std::locale("").name();
R>    setlocale(LC_ALL, localeName.c_str());
R>    std::cout << "Using console locale: " << localeName << std::endl;

R>    std::wcout.imbue(std::locale(localeName.c_str()));
R>    std::wcout << L"Хачу чаю аж кончаю!!!" << std::endl;

R>    return 0;
R>}
R>


Это тоже не работает. И предыдущий пример с wcout.imbue(std::locale("rus_rus.866"));

тоже не работает. То есть std::cout выводит сообщение, а std::wcout ничего не выводит.

Может есть какой-то секретный флаг в компиляторе? Или в опциях что-то включить/выключить надо?
Re[2]: тысячапервый раз про Юникод
От: alzt  
Дата: 08.10.09 08:06
Оценка:
Здравствуйте, catBasilio, Вы писали:

А>>
А>>#include <iostream.h>

А>>void main(){
А>>std::wcout<<L"hello\n\r";
А>>}
А>>


B>
B>std::wcout<<L"hello\n\r" << std::endl;
B>


B>endl кроме перевода строки еще и буфер опорожняет.


Что ещё за новость? Тогда писать надо так:

int main()
{ 
    std::wcout<<L"hello\n\r";
    //...куча другого вывода
    std::wcout << flush;//для надёжности обернуть в RAII.
    return 0;
}


Только никто так не пишет. Буфер можно скинуть предварительно. Но в конце программы он будет скинуть автоматически.
Re: тысячапервый раз про Юникод
От: pepsicoca  
Дата: 08.10.09 08:36
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Добрый день.


А>Есть BCB60. Есть Win2000. И есть такой код:



А>
А>#include <iostream.h>

А>void main(){
А>std::wcout<<L"hello\n\r";
А>}
А>



А>Этот код компилится, линкуется, выполняется, но ничего не печатает .


А>Вопрос:


А>1. Как вывести хотя бы английское сообщение в Юникоде в стандартный поток в Win2000?


А>Спасибо


Попробовал тот же самый код под WinXP на том же самом BCB60. Тот же самый эффект — Юникод не печатает. Приложение создается как виндовское консольное. Может надо что-то включить в консоли?
Re[2]: тысячапервый раз про Юникод
От: Rakafon Украина http://rakafon.blogspot.com/
Дата: 08.10.09 08:44
Оценка:
P>Попробовал тот же самый код под WinXP на том же самом BCB60. Тот же самый эффект — Юникод не печатает. Приложение создается как виндовское консольное. Может надо что-то включить в консоли?

Значит BCB у тебя такой хороший! У меня вот MS VC++ 9.0 прекрасно всё делает!
"Дайте мне возможность выпускать и контролировать деньги в государстве и – мне нет дела до того, кто пишет его законы." (c) Мейер Ансельм Ротшильд , банкир.
Re[3]: тысячапервый раз про Юникод
От: pepsicoca  
Дата: 08.10.09 10:18
Оценка:
Здравствуйте, Rakafon, Вы писали:

P>>Попробовал тот же самый код под WinXP на том же самом BCB60. Тот же самый эффект — Юникод не печатает. Приложение создается как виндовское консольное. Может надо что-то включить в консоли?


R>Значит BCB у тебя такой хороший! У меня вот MS VC++ 9.0 прекрасно всё делает!

R>

Действительно, в MSVC этот код работает. Хотя у меня старая студия — 2003 года.
Re[4]: тысячапервый раз про Юникод
От: Мишень-сан  
Дата: 08.10.09 16:42
Оценка:
Здравствуйте, pepsicoca, Вы писали:

P>Действительно, в MSVC этот код работает. Хотя у меня старая студия — 2003 года.


Я нашёл для себя только один надёжный способ писать напрямую UCS-2 — через WriteConsoleW

Сейчас точно не вспомню, но там был какой-то кретинский прикол с преобразованием внутри потоков всех кодировок к текущей локали, независимо от того, в какой мы работаем. Как-то связано с полнейшей неюникодностью CRT.
Re[5]: тысячапервый раз про Юникод
От: pepsicoca  
Дата: 09.10.09 09:23
Оценка:
Здравствуйте, Мишень-сан, Вы писали:

МС>Я нашёл для себя только один надёжный способ писать напрямую UCS-2 — через WriteConsoleW


МС>Сейчас точно не вспомню, но там был какой-то кретинский прикол с преобразованием внутри потоков всех кодировок к текущей локали, независимо от того, в какой мы работаем. Как-то связано с полнейшей неюникодностью CRT.


Действительно, в BCB60 WriteConsoleW работает. И без всякого предварительного imbue.
Re[6]: тысячапервый раз про Юникод
От: Rakafon Украина http://rakafon.blogspot.com/
Дата: 12.10.09 09:49
Оценка:
Здравствуйте, pepsicoca, Вы писали:
P>Действительно, в BCB60 WriteConsoleW работает. И без всякого предварительного imbue.

Действительно! А почему бы этому "мегарешению" не заработать без imbue? Ведь imbue — это метод задания локального контекста потоковым класса С++,а в случае cout/wcout — задания локали стандартному потоку вывода С++ (который, как вы наверное знаете, может быть перенаправлен из консоли в файл например, + работа с stdout и stdin — это переносимо не только между Windows98 и WindowsXP, но и между другими платформами); вы же работаете с хэндлом консольного окна, т.е. напрямую пишете в буфер консольного окна и никакого отношения к работе со стандартными потоками С++ это не имеет, следовательно вообще вопрос не по С++, а по WinAPI!

P.S.: ... пишу в консоль, используя хэндл консольного окна:

"Дайте мне возможность выпускать и контролировать деньги в государстве и – мне нет дела до того, кто пишет его законы." (c) Мейер Ансельм Ротшильд , банкир.
Re[7]: тысячапервый раз про Юникод
От: pepsicoca  
Дата: 13.10.09 08:39
Оценка:
Здравствуйте, Rakafon, Вы писали:

R>Здравствуйте, pepsicoca, Вы писали:

P>>Действительно, в BCB60 WriteConsoleW работает. И без всякого предварительного imbue.

R>Действительно! А почему бы этому "мегарешению" не заработать без imbue? Ведь imbue — это метод задания локального контекста потоковым класса С++,а в случае cout/wcout — задания локали стандартному потоку вывода С++ (который, как вы наверное знаете, может быть перенаправлен из консоли в файл например, + работа с stdout и stdin — это переносимо не только между Windows98 и WindowsXP, но и между другими платформами); вы же работаете с хэндлом консольного окна, т.е. напрямую пишете в буфер консольного окна и никакого отношения к работе со стандартными потоками С++ это не имеет, следовательно вообще вопрос не по С++, а по WinAPI!


R>P.S.: ... пишу в консоль, используя хэндл консольного окна:


R>


Вот это мне как раз и непонятно. На то и Юникод, чтобы забыть о переключении таблиц символов. Если есть Юникодная строка, зачем мне указывать локаль для потока? Код Юникодного символа ОДНОЗНАЧНО определяет его начертание и принадлежность к тому или иному алфавиту. Зачем еще указывать локаль? Если текущий код это китайский иероглиф — пусть система напечатает китайский иероглиф. Если текущий код это греческая буква "кси" — пусть система напечатает греческую букву "кси". При чем тут локаль — совершенно непонятно.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.