Зачем вообще нужна wprintf?
От: Аноним  
Дата: 12.01.11 20:23
Оценка:
Здравствуйте. Существует горячая дискуссия по всему ру.нету о том, как же выводить в С\С++ в Виндовсе в Консоль русские буквы. Тема старая всем довольно поднадоевшая. У меня родился вопрос, в свою очередь, а зачем, вообще, нужна функция wprintf() для Windows, выводящая исключительно в консоль, а консоль работает исключительно в мультибайтовом режиме? Хочется, конечно, сказать, что только в сp866, но, начиная с Win7, появилась такая вещь, как тру-тайп шрифт, и поддержка кодировки — прекрастнейшей и удобнейшей кодировки — cp1251.

Для каких целей существует данная функция wprintf?
с с++ unicode console windows wprintf
Re: Зачем вообще нужна wprintf?
От: мыщъх США http://nezumi-lab.org
Дата: 12.01.11 22:23
Оценка:
Здравствуйте, Аноним, Вы писали:

А> только в с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.
Re[2]: Зачем вообще нужна wprintf?
От: soolitarY  
Дата: 13.01.11 10:16
Оценка:
Здравствуйте, мыщъх.

Мне ничего не в лом. Возможно, с эпитетами для кодировки я, конечно, перегнул. Я только начинаю изучать С\С++ и хочу разобраться раз и на всегда с выводом в Виндовскую Консоль. В Линуксе Баш в Юникоде работает, на сколько мне известно, — там всё кристально ясно, выводи не хочу. А в Винде крозябры разные, но проблемы, всё равно, острой, как таковой нет — мне очень нравится 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 c c++
Re: Зачем вообще нужна wprintf?
От: Кодёнок  
Дата: 13.01.11 12:09
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте. Существует горячая дискуссия по всему ру.нету о том, как же выводить в С\С++ в Виндовсе в Консоль русские буквы. Тема старая всем довольно поднадоевшая. У меня родился вопрос, в свою очередь, а зачем, вообще, нужна функция wprintf() для Windows, выводящая исключительно в консоль, а консоль работает исключительно в мультибайтовом режиме? Хочется, конечно, сказать, что только в сp866, но, начиная с Win7, появилась такая вещь, как тру-тайп шрифт, и поддержка кодировки — прекрастнейшей и удобнейшей кодировки — cp1251.


True Type не имеет никакого отношения к кодировкам. Консоль в WindowsNT-системах всегда была юникодной (а не только с win7) — во внутреннем представлении по два байта на символ. Чтобы кириллицу можно было показать, она должна присутствовать в выбранном шрифте, и шрифт должен быть нормальным, декларирующим unicode-коды для символов, подстановки и т.п.

А>Для каких целей существует данная функция wprintf?


Аналог printf(), принимающий в качестве формата widechar-строку (плюс пара других тонкостей).
Re[3]: Зачем вообще нужна wprintf?
От: hramovnik  
Дата: 13.01.11 12:38
Оценка:
Y>что на Уникоде
Y>setlocale(LC_ALL,"rus");
Y>wprintf(L"Привет!"); (но теперь "Привет!" весит х2 и длинной х2)

Y>но выйгрыш же наверно есть?


что на Уникоде
wprintf(L"Привет!");

и все. 2 байта, но локаль становится уже не твоей заботой
Re[2]: Зачем вообще нужна wprintf?
От: soolitarY  
Дата: 13.01.11 13:33
Оценка:
Здравствуйте, Кодёнок, Вы писали:

А>>Консоль в WindowsNT-системах всегда была юникодной (а не только с win7) — во внутреннем представлении по два байта на символ.

Разве в win7 консоль Юникодная?

А>>Аналог printf(), принимающий в качестве формата widechar-строку (плюс пара других тонкостей).

Вот как раз тонкости меня и интересуют, зачем стоит использовать расширенный чар? в каких случаях это удобно?
c c++ wprintf() windows
Re[3]: Зачем вообще нужна wprintf?
От: Кодёнок  
Дата: 13.01.11 13:42
Оценка: +1
Здравствуйте, soolitarY, Вы писали:

А>>>Консоль в WindowsNT-системах всегда была юникодной (а не только с win7) — во внутреннем представлении по два байта на символ.

Y>Разве в win7 консоль Юникодная?

Да. И во всех прошлых NT системах тоже.

А>>>Аналог printf(), принимающий в качестве формата widechar-строку (плюс пара других тонкостей).

Y>Вот как раз тонкости меня и интересуют, зачем стоит использовать расширенный чар? в каких случаях это удобно?

Например в тех, когда формат получен извне в виде wchar_t*, чтобы не конвертировать лишний раз.

На самом деле это для юникодных программ, у которых абсолютно все строки в юникоде. Соответственно у всех строковых функций есть юникодные аналоги (printf ↔ wprintf, strlen ↔ wcslen, strcmp ↔ wcscmp и т.д.)
Re[3]: Зачем вообще нужна wprintf?
От: ononim  
Дата: 13.01.11 14:16
Оценка:
А>>>Консоль в WindowsNT-системах всегда была юникодной (а не только с win7) — во внутреннем представлении по два байта на символ.
Y>Разве в win7 консоль Юникодная?
да. Проблема лишь в том, что CRT — не юникодная
Как много веселых ребят, и все делают велосипед...
Re[4]: Зачем вообще нужна wprintf?
От: soolitarY  
Дата: 13.01.11 14:29
Оценка:
Здравствуйте, hramovnik, Вы писали:

A>>и все. 2 байта, но локаль становится уже не твоей заботой

А вот и нет, а вот и нет! В винде как раз-таки снова же кракозябры выведутся, если Локаль не поменять. В том-то и маразм.
(Соответственно, проверял на стандартном консольном шрифте)
А, иногда, вообще ничего не выведется. Так же и с wcout.
wprintf() windows c c++
Re[4]: Зачем вообще нужна wprintf?
От: soolitarY  
Дата: 13.01.11 14:32
Оценка:
Здравствуйте, ononim, Вы писали:

А>>да. Проблема лишь в том, что CRT — не юникодная

Простите, а что такое CRT?
wprintf()
Re[5]: Зачем вообще нужна wprintf?
От: ononim  
Дата: 13.01.11 14:35
Оценка:
А>>>да. Проблема лишь в том, что CRT — не юникодная
Y>Простите, а что такое CRT?
это то, где (w)printf реализовано
Как много веселых ребят, и все делают велосипед...
Re[4]: Зачем вообще нужна wprintf?
От: soolitarY  
Дата: 13.01.11 14:35
Оценка:
Здравствуйте, Кодёнок, Вы писали:

А>>На самом деле это для юникодных программ, у которых абсолютно все строки в юникоде.

Вопрос, наверно, Вам покажется глупым, но всё же: а зачем стоит держать все строки программы в Юникодном режиме?
wprintf
Re[5]: Зачем вообще нужна wprintf?
От: ononim  
Дата: 13.01.11 14:37
Оценка:
А>>>На самом деле это для юникодных программ, у которых абсолютно все строки в юникоде.
Y>Вопрос, наверно, Вам покажется глупым, но всё же: а зачем стоит держать все строки программы в Юникодном режиме?
чтобы не париться с перекодировками
Как много веселых ребят, и все делают велосипед...
Re[6]: Зачем вообще нужна wprintf?
От: soolitarY  
Дата: 13.01.11 15:00
Оценка:
Здравствуйте, ononim, Вы писали:

А>>чтобы не париться с перекодировками

Всё! я попал в замкнутый круг. Юникод, чтобы не париться с перекодировками, но кодировку всё равно надо менять.

Сколько сегодня потрясений! И консоль оказалась в Виндовсе, поддерживающая Юникод.

Слушайте, а ТОЧНО я вспомнил WriteConsoleW() и System::Console::WriteLine() прекрасно русский выводят, а wprintf зависит от Локали.
Значит действительно в Standart C library проблема.

Тогда всё понятно, остается один вопрос: как изменить шрифт консоли из программы написанной на С. Я копался в мсдн по этому поводу, там была какая-то функция, которая ссылалась на сложную непонятную структуру... Ни у кого нет исходного кода, делающего это?

Заранее спасибо.
Re[7]: Зачем вообще нужна wprintf?
От: CreatorCray  
Дата: 13.01.11 15:10
Оценка:
Здравствуйте, soolitarY, Вы писали:

Y>Слушайте, а ТОЧНО я вспомнил WriteConsoleW() и System::Console::WriteLine() прекрасно русский выводят, а wprintf зависит от Локали.

Y>Значит действительно в Standart C library проблема.

Потому что в потрохах там всё через задницу сделано.
Сделай себе обёртку над WriteConsoleW и не парься.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[8]: Зачем вообще нужна wprintf?
От: soolitarY  
Дата: 13.01.11 16:30
Оценка:
Здравствуйте, CreatorCray, Вы писали:

A>>Сделай себе обёртку над WriteConsoleW и не парься.

Ага, я давно уже пилю "идеальную" функцию.
Re[7]: Зачем вообще нужна wprintf?
От: morm Россия  
Дата: 13.01.11 16:38
Оценка:
Здравствуйте, 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;
}


Читай про локаль
Re[8]: Зачем вообще нужна wprintf?
От: soolitarY  
Дата: 13.01.11 17:08
Оценка:
Здравствуйте, morm, Вы писали:

A>>Читай про локаль

Не локаль изменить — это понятно как. А именно шрифт изменить — на Luсida Console, например, из текста программы.
Re[9]: Зачем вообще нужна wprintf?
От: Peregrin  
Дата: 13.01.11 17:15
Оценка:
Здравствуйте, soolitarY, Вы писали:

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


A>>>Читай про локаль

Y>Не локаль изменить — это понятно как. А именно шрифт изменить — на Luсida Console, например, из текста программы.
SetCurrentConsoleFontEx
... << RSDN@Home 1.2.0 alpha 4 rev. 1481>>
Re[9]: Зачем вообще нужна wprintf?
От: CreatorCray  
Дата: 13.01.11 18:07
Оценка:
Здравствуйте, soolitarY, Вы писали:

A>>>Сделай себе обёртку над WriteConsoleW и не парься.

Y>Ага, я давно уже пилю "идеальную" функцию.
И что она в идеале будет уметь делать?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.