Здравствуйте. Существует горячая дискуссия по всему ру.нету о том, как же выводить в С\С++ в Виндовсе в Консоль русские буквы. Тема старая всем довольно поднадоевшая. У меня родился вопрос, в свою очередь, а зачем, вообще, нужна функция 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)
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте. Существует горячая дискуссия по всему ру.нету о том, как же выводить в С\С++ в Виндовсе в Консоль русские буквы. Тема старая всем довольно поднадоевшая. У меня родился вопрос, в свою очередь, а зачем, вообще, нужна функция wprintf() для Windows, выводящая исключительно в консоль, а консоль работает исключительно в мультибайтовом режиме? Хочется, конечно, сказать, что только в сp866, но, начиная с Win7, появилась такая вещь, как тру-тайп шрифт, и поддержка кодировки — прекрастнейшей и удобнейшей кодировки — cp1251.
True Type не имеет никакого отношения к кодировкам. Консоль в WindowsNT-системах всегда была юникодной (а не только с win7) — во внутреннем представлении по два байта на символ. Чтобы кириллицу можно было показать, она должна присутствовать в выбранном шрифте, и шрифт должен быть нормальным, декларирующим unicode-коды для символов, подстановки и т.п.
А>Для каких целей существует данная функция wprintf?
Аналог printf(), принимающий в качестве формата widechar-строку (плюс пара других тонкостей).
Здравствуйте, Кодёнок, Вы писали:
А>>Консоль в WindowsNT-системах всегда была юникодной (а не только с win7) — во внутреннем представлении по два байта на символ.
Разве в win7 консоль Юникодная?
А>>Аналог printf(), принимающий в качестве формата widechar-строку (плюс пара других тонкостей).
Вот как раз тонкости меня и интересуют, зачем стоит использовать расширенный чар? в каких случаях это удобно?
Здравствуйте, soolitarY, Вы писали:
А>>>Консоль в WindowsNT-системах всегда была юникодной (а не только с win7) — во внутреннем представлении по два байта на символ. Y>Разве в win7 консоль Юникодная?
Да. И во всех прошлых NT системах тоже.
А>>>Аналог printf(), принимающий в качестве формата widechar-строку (плюс пара других тонкостей). Y>Вот как раз тонкости меня и интересуют, зачем стоит использовать расширенный чар? в каких случаях это удобно?
Например в тех, когда формат получен извне в виде wchar_t*, чтобы не конвертировать лишний раз.
На самом деле это для юникодных программ, у которых абсолютно все строки в юникоде. Соответственно у всех строковых функций есть юникодные аналоги (printf ↔ wprintf, strlen ↔ wcslen, strcmp ↔ wcscmp и т.д.)
А>>>Консоль в 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, значит пора закрыть эту страницу.
Всем пока