Здравствуйте, morm, Вы писали:
A>>>>Читай про локаль Y>>Не локаль изменить — это понятно как. А именно шрифт изменить — на Luсida Console, например, из текста программы.
M>А зачем?
Наверное чтобы отправить в психушку пользователей Far, у которых после каждой утилитки в окне будет новый шрифт.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте. Существует горячая дискуссия по всему ру.нету о том, как же выводить в С\С++ в Виндовсе в Консоль русские буквы. Тема старая всем довольно поднадоевшая. У меня родился вопрос, в свою очередь, а зачем, вообще, нужна функция wprintf() для Windows, выводящая исключительно в консоль, а консоль работает исключительно в мультибайтовом режиме? Хочется, конечно, сказать, что только в сp866, но, начиная с Win7, появилась такая вещь, как тру-тайп шрифт, и поддержка кодировки — прекрастнейшей и удобнейшей кодировки — cp1251.
True Type не имеет никакого отношения к кодировкам. Консоль в WindowsNT-системах всегда была юникодной (а не только с win7) — во внутреннем представлении по два байта на символ. Чтобы кириллицу можно было показать, она должна присутствовать в выбранном шрифте, и шрифт должен быть нормальным, декларирующим unicode-коды для символов, подстановки и т.п.
А>Для каких целей существует данная функция wprintf?
Аналог printf(), принимающий в качестве формата widechar-строку (плюс пара других тонкостей).
Здравствуйте, soolitarY, Вы писали:
А>>>Консоль в WindowsNT-системах всегда была юникодной (а не только с win7) — во внутреннем представлении по два байта на символ. Y>Разве в win7 консоль Юникодная?
Да. И во всех прошлых NT системах тоже.
А>>>Аналог printf(), принимающий в качестве формата widechar-строку (плюс пара других тонкостей). Y>Вот как раз тонкости меня и интересуют, зачем стоит использовать расширенный чар? в каких случаях это удобно?
Например в тех, когда формат получен извне в виде wchar_t*, чтобы не конвертировать лишний раз.
На самом деле это для юникодных программ, у которых абсолютно все строки в юникоде. Соответственно у всех строковых функций есть юникодные аналоги (printf ↔ wprintf, strlen ↔ wcslen, strcmp ↔ wcscmp и т.д.)
Здравствуйте, Кодёнок, Вы писали:
A>>Наверное чтобы отправить в психушку пользователей Far, у которых после каждой утилитки в окне будет новый шрифт.
Простите мне мою неосведомленность, а что такое Far?
Зачем вообще нужна wprintf?
От:
Аноним
Дата:
12.01.11 20:23
Оценка:
Здравствуйте. Существует горячая дискуссия по всему ру.нету о том, как же выводить в С\С++ в Виндовсе в Консоль русские буквы. Тема старая всем довольно поднадоевшая. У меня родился вопрос, в свою очередь, а зачем, вообще, нужна функция wprintf() для Windows, выводящая исключительно в консоль, а консоль работает исключительно в мультибайтовом режиме? Хочется, конечно, сказать, что только в сp866, но, начиная с Win7, появилась такая вещь, как тру-тайп шрифт, и поддержка кодировки — прекрастнейшей и удобнейшей кодировки — cp1251.
Для каких целей существует данная функция wprintf?
Здравствуйте, Аноним, Вы писали:
А> только в сp866, но, начиная с Win7, появилась такая вещь, как тру-тайп шрифт, А> и поддержка кодировки — прекрастнейшей и удобнейшей кодировки — cp1251.
замечательно. то есть, вам в лом написать несколько строчек чтобы поддержать w2k, xp, s2k3, etc, а мне в лом ставить семерку ради вашей замечательной программы. кстати, проблему KOI8 семерка все равно не решает. а если я пишу под никсами на ANSI C ? а что если это китайская винда вообще? ну или не китайская... вы вообще в курсе, что под виндой отродясь есть команда CHCP ?! вывод в консоль вообще-то не самая тривиальная операция... особенно если мы пишем не только под винду и не только под русскую.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Мне ничего не в лом. Возможно, с эпитетами для кодировки я, конечно, перегнул. Я только начинаю изучать С\С++ и хочу разобраться раз и на всегда с выводом в Виндовскую Консоль. В Линуксе Баш в Юникоде работает, на сколько мне известно, — там всё кристально ясно, выводи не хочу. А в Винде крозябры разные, но проблемы, всё равно, острой, как таковой нет — мне очень нравится WinAPI функция CharToOem(), решающая все мои проблемы.
мыщъх, Вы писали: А>> если это китайская винда вообще?
Сам я не использую тру-тайп шрифт, т.к. прогу запускаю из MS VS, а там по-умолчанию стоит стандартный консольный шрифт. А менять шрифт консоли из своей программы, я пока не умею. А Стандартный консольный шрифт китайские буквы не выводит, даже при соответствующей Локали(проверял).
мыщъх, Вы писали: А>> вы вообще в курсе, что под виндой отродясь есть команда CHCP ?!
system("chcp 1251"); — слышал. при стандартном шрифте выводит кракозябры.
мыщъх, Вы писали: А>> вывод в консоль вообще-то не самая тривиальная операция... особенно если мы пишем не только под винду...
Я пока пишу только под Винду, и меня интересует эта тема.
Теперь непосредственно к вопросу. Почему я говорил про сп1251 — все файлы(с которыми я работаю) находятся в данной кодировке, она удобная в отношении расположения символов, и каждый символ занимает один байт(вычисление длинны, передача в потоки и т.д.).
При переходе на Юникод возникают, по моему скромному мнению, проблемы с величиной символа — он теперь 2 байтовый, всю целиком таблицу перед глазами иметь не получится и пр. И переходя на него, должны быть какие-то серьезные причины, оправдывающие неудобства. Так вот, какие причины могут быть для использования wprintf для вывода? зачем-то же ее сделали?
wprintf работает исключитльно с консолью, переводит уникодные символы в чаровые, соответственно Локали(на сколько я осведомлен) и никакого выйгрыша как бы нет?
напр, что написать
setlocale(LC_ALL,"rus");
printf("Привет!");
что на Уникоде
setlocale(LC_ALL,"rus");
wprintf(L"Привет!"); (но теперь "Привет!" весит х2 и длинной х2)
Здравствуйте, Кодёнок, Вы писали:
А>>Консоль в WindowsNT-системах всегда была юникодной (а не только с win7) — во внутреннем представлении по два байта на символ.
Разве в win7 консоль Юникодная?
А>>Аналог printf(), принимающий в качестве формата widechar-строку (плюс пара других тонкостей).
Вот как раз тонкости меня и интересуют, зачем стоит использовать расширенный чар? в каких случаях это удобно?
А>>>Консоль в WindowsNT-системах всегда была юникодной (а не только с win7) — во внутреннем представлении по два байта на символ. Y>Разве в win7 консоль Юникодная?
да. Проблема лишь в том, что CRT — не юникодная
Как много веселых ребят, и все делают велосипед...
Здравствуйте, hramovnik, Вы писали:
A>>и все. 2 байта, но локаль становится уже не твоей заботой
А вот и нет, а вот и нет! В винде как раз-таки снова же кракозябры выведутся, если Локаль не поменять. В том-то и маразм.
(Соответственно, проверял на стандартном консольном шрифте)
А, иногда, вообще ничего не выведется. Так же и с wcout.
Здравствуйте, Кодёнок, Вы писали:
А>>На самом деле это для юникодных программ, у которых абсолютно все строки в юникоде.
Вопрос, наверно, Вам покажется глупым, но всё же: а зачем стоит держать все строки программы в Юникодном режиме?
А>>>На самом деле это для юникодных программ, у которых абсолютно все строки в юникоде. Y>Вопрос, наверно, Вам покажется глупым, но всё же: а зачем стоит держать все строки программы в Юникодном режиме?
чтобы не париться с перекодировками
Как много веселых ребят, и все делают велосипед...
Здравствуйте, ononim, Вы писали:
А>>чтобы не париться с перекодировками
Всё! я попал в замкнутый круг. Юникод, чтобы не париться с перекодировками, но кодировку всё равно надо менять.
Сколько сегодня потрясений! И консоль оказалась в Виндовсе, поддерживающая Юникод.
Слушайте, а ТОЧНО я вспомнил WriteConsoleW() и System::Console::WriteLine() прекрасно русский выводят, а wprintf зависит от Локали.
Значит действительно в Standart C library проблема.
Тогда всё понятно, остается один вопрос: как изменить шрифт консоли из программы написанной на С. Я копался в мсдн по этому поводу, там была какая-то функция, которая ссылалась на сложную непонятную структуру... Ни у кого нет исходного кода, делающего это?
Здравствуйте, soolitarY, Вы писали:
Y>Слушайте, а ТОЧНО я вспомнил WriteConsoleW() и System::Console::WriteLine() прекрасно русский выводят, а wprintf зависит от Локали. Y>Значит действительно в Standart C library проблема.
Потому что в потрохах там всё через задницу сделано.
Сделай себе обёртку над WriteConsoleW и не парься.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, soolitarY, Вы писали:
Y>Здравствуйте, ononim, Вы писали:
А>>>чтобы не париться с перекодировками Y>Всё! я попал в замкнутый круг. Юникод, чтобы не париться с перекодировками, но кодировку всё равно надо менять.
Y>Сколько сегодня потрясений! И консоль оказалась в Виндовсе, поддерживающая Юникод.
Y>Слушайте, а ТОЧНО я вспомнил WriteConsoleW() и System::Console::WriteLine() прекрасно русский выводят, а wprintf зависит от Локали. Y>Значит действительно в Standart C library проблема.
Y>Тогда всё понятно, остается один вопрос: как изменить шрифт консоли из программы написанной на С. Я копался в мсдн по этому поводу, там была какая-то функция, которая ссылалась на сложную непонятную структуру... Ни у кого нет исходного кода, делающего это?
Y>Заранее спасибо.
Попробуй вот это:
#include <string>
#include <iostream>
using std::cout;
using std::endl;
int main(int argc, char* argv[])
{
std::locale::global(std::locale(""));
cout << "Привет" << endl;
return 0;
}
Здравствуйте, morm, Вы писали:
A>>Читай про локаль
Не локаль изменить — это понятно как. А именно шрифт изменить — на Luсida Console, например, из текста программы.
Здравствуйте, soolitarY, Вы писали:
Y>Здравствуйте, morm, Вы писали:
A>>>Читай про локаль Y>Не локаль изменить — это понятно как. А именно шрифт изменить — на Luсida Console, например, из текста программы.
SetCurrentConsoleFontEx
Здравствуйте, soolitarY, Вы писали:
A>>>Сделай себе обёртку над WriteConsoleW и не парься. Y>Ага, я давно уже пилю "идеальную" функцию.
И что она в идеале будет уметь делать?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, soolitarY, Вы писали:
Y>Здравствуйте, morm, Вы писали:
A>>>Читай про локаль Y>Не локаль изменить — это понятно как. А именно шрифт изменить — на Luсida Console, например, из текста программы.
Y>Слушайте, а ТОЧНО я вспомнил WriteConsoleW() и System::Console::WriteLine() прекрасно русский выводят, а wprintf зависит от Локали. Y>Значит действительно в Standart C library проблема.
Здравствуйте, Кодёнок, Вы писали:
Кё>Наверное чтобы отправить в психушку пользователей Far, у которых после каждой утилитки в окне будет новый шрифт.
Думаю что жизнь такой утилитки будет коротка и конец её будет печален.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, CreatorCray, Вы писали:
A>>И что она в идеале будет уметь делать?
ммм... ну как минимум то, что и принтф, + русский шрифт норм выводить.
Хотя в выводе нет такой проблемы. Я всегда мечтал о функции ввода, которая бы проверяла число на переполнение и не давала пользователю ввести иначе, как 4 млрд с копейками, кнопочки сколько не нажимай — не печатается. и соответственно количества разрядов, чтобы тоже ввод регулировался...
Главное найти оптимальное соотношение кол-ва написанных строк с кол-вом полезных строк)
Здравствуйте, morm, Вы писали:
A>>А зачем?
А знаете — всё бонально. Просто, чтобы знать — как это делать и уметь это делать.
Менять шрифт, судя по гуглу, — дело не благодарное и трудоемкое. Взяв исходники 4х вариантов реализации — не один из них изменить шрифт так и не смог, хотя там были выпады и через подключение длл вручную и вызов функции по имени, и в зависимости от версии системы вызов разных функций, и вызов секретной недокументированной функции мсдн, которая годами скрывалась хитрыми разработчиками Виндовса, изменениче параметров реестра влоб, ну и бональное SetCurrentConsoleFontEx(). К сожалению, чего-та никак совсем. Возможно, дело в том, (я программирую на MS VS) MS VS устанавливает свою консоль (в ручную в свойствах — в ней всё прекрасно меняется, а вот програмно(( ), и при нажатии F5 запускается именно она, а параметры, наверно, меняются в Виндовской стандартной cmd.exe. Хотя вызовы проги из-под cmd.exe успехов не принесли, кроме смены размера, хотя прямое его изменение я не заметил, размер изменился после закрытия консоли и открытия ее снова. Угу. Консоль же придется еще и обновлять! Это я щас чего-то додумался.
Вообще, как я понял, всё дело осложняет еще и то, что во всем мсдн'е нету такой прекрасной таблички, в которой каждому имени шрифта соответствовало бы значение структуры CONSOLE_FONT_INFO(ЕХ) и всех ее параметров для оного шрифта. И находить соответствия приходится методом научного тыка. Я пока не ощущаю себя на столько хорошим программистом, чтобы пользоваться данным методом.
И дело ведь еще именно в том, что мне хочется менять шрифт именно MS VS консоли, чтобы видеть как он меняется, т.к. до релизов еще пока мои учебные проги не добирались, а презентую я их именно в VS.
Менять шрифт в целях неучебных я, кончено, не собираюсь.
А после завершения работы проги, но до ее завершения совсем — шрифты всегда можно и нужно вернуть и, я думаю, на работу самой операционной системы моё рукаделие нигативного влияние не окажет.
Здравствуйте, soolitarY, Вы писали:
Y>Здравствуйте, morm, Вы писали:
A>>>А зачем? Y>А знаете — всё бонально. Просто, чтобы знать — как это делать и уметь это делать.
Y>Менять шрифт, судя по гуглу, — дело не благодарное и трудоемкое. Взяв исходники 4х вариантов реализации — не один из них изменить шрифт так и не смог, хотя там были выпады и через подключение длл вручную и вызов функции по имени, и в зависимости от версии системы вызов разных функций, и вызов секретной недокументированной функции мсдн, которая годами скрывалась хитрыми разработчиками Виндовса, изменениче параметров реестра влоб, ну и бональное SetCurrentConsoleFontEx(). К сожалению, чего-та никак совсем. Возможно, дело в том, (я программирую на MS VS) MS VS устанавливает свою консоль (в ручную в свойствах — в ней всё прекрасно меняется, а вот програмно(( ), и при нажатии F5 запускается именно она, а параметры, наверно, меняются в Виндовской стандартной cmd.exe. Хотя вызовы проги из-под cmd.exe успехов не принесли, кроме смены размера, хотя прямое его изменение я не заметил, размер изменился после закрытия консоли и открытия ее снова. Угу. Консоль же придется еще и обновлять! Это я щас чего-то додумался.
Y>Вообще, как я понял, всё дело осложняет еще и то, что во всем мсдн'е нету такой прекрасной таблички, в которой каждому имени шрифта соответствовало бы значение структуры CONSOLE_FONT_INFO(ЕХ) и всех ее параметров для оного шрифта. И находить соответствия приходится методом научного тыка. Я пока не ощущаю себя на столько хорошим программистом, чтобы пользоваться данным методом.
Y>И дело ведь еще именно в том, что мне хочется менять шрифт именно MS VS консоли, чтобы видеть как он меняется, т.к. до релизов еще пока мои учебные проги не добирались, а презентую я их именно в VS. Y>Менять шрифт в целях неучебных я, кончено, не собираюсь. Y>А после завершения работы проги, но до ее завершения совсем — шрифты всегда можно и нужно вернуть и, я думаю, на работу самой операционной системы моё рукаделие нигативного влияние не окажет.
Теперь при приеме на работу очередного работника обязательно буду спрашивать про Far и printf Почитайте про boost.format, про локаль, про кроссплатформенный код, посмотрите как работает QObject::tr, про использование TCHAR и т.п. Я так и не понял чем вам мешает изменение локали?! Какое-то кривое решение — изменение шрифтов к консоли, которое привязывает к операционке (причем не факт, что в след. версиях все также работать будет) — вам нравится .
Здравствуйте, morm, Вы писали:
A>>Теперь при приеме на работу очередного работника обязательно буду спрашивать про Far и printf
Я прочитал про Far, к сожалению, я не застал то прекрасное время, когда компьютеры еще работали в реальном режиме. Моей первой ОС был Windows 98 Second Edition и Pentium II 433 MHz. Сила привычки людей, конечно, меня поразила, судя по популярности данного проекта!
Я так и не понял чем вам мешает изменение локали?!
Ничего не мешает. Хотел просто узнать стоит ли мне юзать wprintf.
A>>Почитайте про boost.format, про локаль, про кроссплатформенный код, посмотрите как работает QObject::tr, про использование TCHAR и т.п.
Про локаль читал, про TCHAR тоже — вроде разработка винды, которая в соответствии с #define _UNICODE переключается между wchar_t и char.
С++ и ООП мы будем проходить в Универе только в следующем семестре, поэтому пока еще я ничего не понимаю в библиотеках С++, классах и шаблонах.
На сколько я понял из многочисленных книг по С, кроссплатформенный код — это POSIX стандарт реализованный на всех платформах, но при работе всегда возникают какие-то нюансы, которые невозможно описать на чистом С, (в моем случае) приходится пользоваться WinAPI(например, FillConsoleOutputAttribute) или командами системе(например, sleep(1000)).
A>>Какое-то кривое решение — изменение шрифтов к консоли, которое привязывает к операционке
Любой код, решающий более или менее сложную задачу, привязывает к операционке, мне кажется.(конечно, это решаешься #ifdef и доп. кодом)
Но шрифт же можно как-то поменять? Это какой-то принципиальностью для меня стало — я если всё же смогу поменять и увижу результат — то, скорее всего, больше никогда не буду это делать, вспоминая каких трудов мне это стоило. Поэтому практической пользы в этом никакой нет, окромя опыта
Здравствуйте, soolitarY, Вы писали:
A>>>Наверное чтобы отправить в психушку пользователей Far, у которых после каждой утилитки в окне будет новый шрифт. Y>Простите мне мою неосведомленность, а что такое Far?
Google FAR -> http://www.farmanager.com/
A>>>Теперь при приеме на работу очередного работника обязательно буду спрашивать про Far и printf Y>Я прочитал про Far, к сожалению, я не застал то прекрасное время, когда компьютеры еще работали в реальном режиме. Моей первой ОС был Windows 98 Second Edition и Pentium II 433 MHz. Сила привычки людей, конечно, меня поразила, судя по популярности данного проекта!
А причем тут реальный режим?
Y>Я так и не понял чем вам мешает изменение локали?!
Изменение локали — ничем, потому что они только вашей проги касаются. А вот шрифты левые в кконсоли после запуска левой тулзы..
Как много веселых ребят, и все делают велосипед...
Здравствуйте, soolitarY, Вы писали:
A>>>Теперь при приеме на работу очередного работника обязательно буду спрашивать про Far и printf Y>Я прочитал про Far, к сожалению, я не застал то прекрасное время, когда компьютеры еще работали в реальном режиме. Моей первой ОС был Windows 98 Second Edition и Pentium II 433 MHz. Сила привычки людей, конечно, меня поразила, судя по популярности данного проекта!
В то прекрасное время Far ещё не было.
Far появился во времена Win95 и сразу под windows.
И ты не поверишь, есть уже и FAR под Win64.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока