Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.92
kravam
быдлокодер
1702 / 889 / 45
Регистрация: 04.06.2008
Сообщений: 5,499
#1

Почему чтобы корректно отображались русские буквы в консоли, мало изменить кодировку - C++

22.11.2012, 09:06. Просмотров 3641. Ответов 31
Метки нет (Все метки)

Последнее-то что даёт? Имеем:
C++
1
printf ("sы");
на выходе- s<кракозябр> а почему? смотрим, что у нас в экзешнике, там где должно быть "sы". А там таких два байта (ну то есть кодовая таблица 1251 в миниатюре)

s->0X73 ы->0Xfb

Разбираемся, что происходит, при печати. А происходит следующее: мы говорим консоли: "консоль, напечатай два байта 0X73 и 0Xfb" После чего консоль смотрит в СВОЮ таблицу кодировки, вот она:

s->0X73 <кракозябр>->0Xfb

и печатает СООТВЕТСТВЕННО ЕЙ:
C++
1
s<кракозябр>
Чё делать? А давай подменим консольную таблицу кодировки на нужную нам, на 1251. Подменяем:
C++
1
2
 SetConsoleOutputCP(1251);
printf ("sы");
Теперь консоль при печати двух символов смотрит в ту таблицу кодировки, которую мы ей подсунули, видит:

s->0X73 ы->0Xfb

и печатает НЕСООТВЕТСТВЕННО ЕЙ:

C++
1
s<кракозябр>
Гениально. Собсно, на этом можно было бы и остановится. Корректная печать призводится только если к этим действиям добавить ещё и смену шрифта с точечного на Lucida Console. Механизм такой смены мне абсолютно непонятен, таблицу кодировки заменили чё ещё надо? Тем не менее, заменять шрифт необходимо, а почему- неясно. Спасибо, кто объяснит, зачем.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.11.2012, 09:06
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему чтобы корректно отображались русские буквы в консоли, мало изменить кодировку (C++):

Сделать, чтобы в консоли отображались русские буквы, а не кракозябры - C++
Собственно вместо русских букв выдает кракозябры. Шрифт Lucida. Как пофиксить? #include &lt;stdio.h&gt; #include &lt;iostream&gt; #include...

Русские буквы консоли - C++
Знаю что таких тембыло очень много, но у меня никак не получается вывести слово &quot;Привет&quot; в консоли. Пробую так ...

Русские буквы в консоли - C++
У меня прекрастно выводятся русские буквы в консоль, но если я ввожу русский текст в какуюту переменную, то вывести ее коректно не...

Русские буквы в консоли на Microsoft Visual C++ 6.0 - C++
Как по проше можно вывисти русские буквы в консоли на Microsoft Visual C++ 6.0. такой способ не срабатывает #include &lt;locale.h&gt; ...

Почему MS Visual C++ не показывает русские буквы - C++
Вот такая программа(код) // rrrrrrrr.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include...

Нужен совет: Какую библиотетеку подключить, чтобы в консоли русские символы были - C++
Какую библиотетеку подключить что бы в консоли русские символы были ?

31
Croessmah
Ушел
Эксперт CЭксперт С++
13554 / 7705 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
22.11.2012, 09:17 #2
Локализация консольных приложений

Добавлено через 1 минуту
P.S. Кто мне, например, как создателю шрифта MyFont мешает заменить начертание 'А' на <ересь>?
0
kravam
быдлокодер
1702 / 889 / 45
Регистрация: 04.06.2008
Сообщений: 5,499
22.11.2012, 09:27  [ТС] #3
Сами-то читали. прежде чем давать?
При использовании функций настройки кон-
соли русские буквы будут отображаться пра-
вильно, если для консольного окна выбран
шрифт
Lucida Console
. Для выбора шрифта
нужно щелкнуть правой кнопкой мыши по за-
головку окна, выполнить команду Свойства , а
затем на вкладке Шрифт выбрать нужный
шрифт.
и всё!
Так-то я и сам знаю, что надо шрифт изменить, а что мне непонятно, я описал в посте N 1
0
Croessmah
Ушел
Эксперт CЭксперт С++
13554 / 7705 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
22.11.2012, 09:41 #4
Читайте всё, а не кусок!
0
kravam
быдлокодер
1702 / 889 / 45
Регистрация: 04.06.2008
Сообщений: 5,499
22.11.2012, 10:06  [ТС] #5
Я всё прочёл РАНЬШЕ.
0
kravam
быдлокодер
1702 / 889 / 45
Регистрация: 04.06.2008
Сообщений: 5,499
24.11.2012, 12:52  [ТС] #6
Есть у кого-нибудь ответ на мой вопрос?
0
Jupiter
24.11.2012, 12:59
  #7

Не по теме:

Цитата Сообщение от kravam Посмотреть сообщение
почему чтобы корректно отображались русские буквы в консоли, мало изменить кодировку, а надо ещё и шрифт менять?
этот вопрос нужно задавать разбам винды

0
kravam
быдлокодер
1702 / 889 / 45
Регистрация: 04.06.2008
Сообщений: 5,499
24.11.2012, 18:30  [ТС] #8
Ну то есть вы согласны со мной, что применяя
C++
1
SetConsoleOutputCP(1251);
, а после чего меняя шрифт, мы совершаем два совершенно одинаковых действия? А разработчики сделали так, чтобы мы эти два одинаковых действия сделали (а не какое-нибудь одно) и именно в таком порядке и тогда шрифт поменяется, так?

Добавлено через 5 часов 17 минут
Мне на данный момент надо увидеть разницу между "поменять кодировку" "поменять шрифт". Пока же я вижу два АБСОЛЮТНО ОДИНАКОВЫХ действия (надеюсь что это не так и разница будет мне разъяснена), и тогда да, остаётся усомниться в здравомыслии разработчиков.
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.11.2012, 21:31 #9
В Win XP, в Стандартных - Системных есть Таблица символов. Если там посмотреть шрифт Terminal (похоже, что это он используется в качестве точечного в консоли), то там кодировка отличная от кодировки Lucida Console (Windows кирилица). И если для шрифта Lucida Console можно выбирать Набор символов (Windows кирилица, DOS кирилица и т.д.), то для Terminal такого выбора нет. Специфика точечных шрифтов?
1
Jupiter
24.11.2012, 21:37
  #10

Не по теме:

Цитата Сообщение от kravam Посмотреть сообщение
и тогда да, остаётся усомниться в здравомыслии разработчиков.
имхо - стоит усомниться в здравомыслии разработчиков уже потому что дефолтная кодировка не utf-8!

0
kravam
быдлокодер
1702 / 889 / 45
Регистрация: 04.06.2008
Сообщений: 5,499
24.11.2012, 22:54  [ТС] #11
Цитата Сообщение от alsav22 Посмотреть сообщение
Специфика точечных шрифтов?
Да нужна мне специфика точечных шрифтов, мне нужна специфика применения точечных шрифтов. Но начнём с простого. Итак, Lucida Console

C++
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <windows.h>
int main () {
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 unsigned char simvol= 'Г›';
 printf ("%d\n", simvol);
 printf ("%c\n", simvol);
 getchar ();
 return 0;
}
А теперь скажите мне, как консоль винда или кто ещё может найти в таблице шрифта Lucida Console на месте N 219 символ 'Ы', если его там просто-напросто нет?
А есть там вот такая чушь: Ē. Но печатается-то Ы!
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.11.2012, 23:49 #12
Как бы есть, и как бы 219.
0
Миниатюры
Почему чтобы корректно отображались русские буквы в консоли, мало изменить кодировку  
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.11.2012, 00:16 #13
Удалил.
0
kravam
быдлокодер
1702 / 889 / 45
Регистрация: 04.06.2008
Сообщений: 5,499
25.11.2012, 00:34  [ТС] #14
Отлично. А теперь так:
C++
1
2
3
4
5
6
7
8
#include <stdio.h>
int main () {
 unsigned char simvol= 'Г›';
 printf ("%d\n", simvol);
 printf ("%c\n", simvol);
 getchar ();
 return 0;
}
Мы говорим консоли: консоль, используя шрифт Lucida Console, напечатай нам символ, который 219! И она печатает, но не 'Ы', а какую-то херь! Почему?
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.11.2012, 00:44 #15
Как бы печатает.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <windows.h>
using namespace std;
 
int main()
{
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 
 cout << (char)219 << endl;
 
 cin.get();
 return 0;
}
0
Миниатюры
Почему чтобы корректно отображались русские буквы в консоли, мало изменить кодировку  
25.11.2012, 00:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2012, 00:44
Привет! Вот еще темы с ответами:

Почему неправильно отображаются введенные русские буквы? - C++
Почему вводя русские буквы , функция gets выдаёт другие символы? int main() { setlocale(LC_ALL, &quot;Russian&quot;); char str; cout &lt;&lt;...

Переработать строку и изменить все русские буквы Ф на русскую букву Ю - C++
Возникла такая необходимость. Переработать строку и изменить все русские буквы Ф на русскую букву Ю. Вышла вот такая вот программа: ...

Нужно, чтобы проверяло, если ли русские буквы в строке - C++
В строке должны быть буквы английского алфавита, цифры и пробелы. И если буква русская, то оповещать об этом. int proverka_processor(int...

Как сделать так, чтобы программа понимала русские буквы? - C++
И если знаете как убрать этот огромный массив символов &quot;char mass2&quot; на chr виснет все... Так вот код программы. Мне нужно чтобы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru