Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.97/35: Рейтинг темы: голосов - 35, средняя оценка - 4.97
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709

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

22.11.2012, 09:06. Показов 7812. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.11.2012, 09:06
Ответы с готовыми решениями:

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

Как создать шрифт, чтобы печатая русские буквы, отображались русскими а компьютер воспринимал бы кодировку как английских букв
Помогите создать шрифт, чтобы печатая русские буквы, отображались русскими а компьютер воспринимал бы кодировку как английских букв. Знаю,...

Как сменить кодировку, чтобы Лазарус понимал русские буквы?
Пртвет ,собственно при сохранение файла имя берётся из эдита и получаем файл с таким названием (РєСѓСЂР°) как сделать чтобы за место этой...

31
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
25.11.2012, 14:48  [ТС]
Студворк — интернет-сервис помощи студентам
Не, короче я соврал с первой таблицей, на неё не смотреть. По умолчанию задействуется (ДОЛЖНА задействоваться, но увы) вот эта, вторая то есть, где написано "Набор символов: Windows Кирилица". Вот она и есть страница по умолчанию и там 'Ы' это и есть 0XDB (219), всё как и положено. Но НА САМОМ ДЕЛЕ задействуется таблица из предыдущего поста, хотя указана эта!
Миниатюры
Почему чтобы корректно отображались русские буквы в консоли, мало изменить кодировку  
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
25.11.2012, 14:56  [ТС]
Чё-то я запутался, повремените отвечать, щас подумаю
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
25.11.2012, 15:46
Добавлено через 8 минут
Цитата Сообщение от Jupiter Посмотреть сообщение
alsav22, а знаковый ли этот char?
Не совсем понятно, почему такой вопрос. Но у меня (Студия), насколько я понял, char знаковый.
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
25.11.2012, 16:19
Цитата Сообщение от alsav22 Посмотреть сообщение
Не совсем понятно, почему такой вопрос. Но у меня (Студия), насколько я понял, char знаковый.
потому что знаковый чар или нет - implementation defined
а 219 в знаковый чар уже не влазит
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
25.11.2012, 16:39
Насчёт точечных шрифтов (те которые для консоли (предположительно Terminal)) приблизительно понятно. Получается, что они используют только одну кодовую страницу: DOS: кирилица2 (поэтому и перключения набора символов в Таблице символов для них нет). Такой код, для точечного шрифта (коды для Terminal), выводит одни и те же символы, в не зависимости от того, какая кодовая страница прописана в коде (второй скрин, если в коде прописана 1251):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <Windows.h>
using namespace std;
 
int main(void)
{
    int n = 12;
    int m = 20;
    int i = 0x21;
    int j = 0xFF;
    //SetConsoleCP(1251);
    //SetConsoleOutputCP(1251);
    
    for ( n = 0; n < 12; n++)
    {
        for (m = 0; m < 20 && i <= j; m++)
        {
            cout << (char)i << ' ';
            i++;
        }
        cout << endl;
    }
        
    system("Pause");
    return 0;
}
Для Lucida Console есть выбор кодовых страниц.
Миниатюры
Почему чтобы корректно отображались русские буквы в консоли, мало изменить кодировку   Почему чтобы корректно отображались русские буквы в консоли, мало изменить кодировку  
1
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
25.11.2012, 16:41  [ТС]
Да, я сделал примерно такой же вывод:

Консоль работает с указаным шрифтом и ищет в нём страницу с указанной кодировкой. После чего всё выводится на экран.
И всё бы ничего, но этот номер проходит только со шрифтом Lucida Console, а для остальных шрифтов кодировка тупо не меняется. Почему? Дело тёмное. Начаь с того, что шрифты не идентифицированы для консоли. Точечные и всё тут, вот что хочешь то и думай. Вроде бы шрифты полноценные, включают в себя по многу кодировочных страниц, тем не менее создаётся впечатление, что консоль просто не находит в этих шрифтах нужных страниц, ровно как специально так сделано. Хотя они, повторяю, там есть.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
25.11.2012, 16:57
Цитата Сообщение от kravam Посмотреть сообщение
Вроде бы шрифты полноценные, включают в себя по многу кодировочных страниц, тем не менее создаётся впечатление, что консоль просто не находит в этих шрифтах нужных страниц, ровно как специально так сделано.
Может не находит потому, что искать нечего? Специально сделано, что для них только одна кодовая страница. Поэтому, наверное, у Terminal, в Таблице символов, погашен выбор набора символов (кодировок).

Добавлено через 46 секунд
Цитата Сообщение от kravam Посмотреть сообщение
Хотя они, повторяю, там есть.
Где видно, что они есть? Наример, для этих: Terminal, System, Symbol.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
25.11.2012, 17:38  [ТС]
Для этих может и не видно, для других видно. Для Arial, например.
Узнать какой именно шрифт установлен не представляется возможным.

Вот код, выводится индекс шрифта в таблице системных шрифтов. Таблицу днём с огнём не сыскать. GetCurrentConsoleFont в инкладах отсутствует. Работает через раз по-разному. То Lucida Console определена как 6 то как 10

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <windows.h>
#include <stdio.h>
 
 
int main () {
 
 //Это надо для работы в Lucida Console
 SetConsoleCP (1251);
 SetConsoleOutputCP (1251);
 
 //Определимся со структурой CONSOLE_FONT_INFO
 CONSOLE_FONT_INFO CFI;
 CONSOLE_FONT_INFO* pCFI= &CFI; 
 
 //Информация о шрифте- так, чтобы знать! 
 GetCurrentConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE), false, pCFI);
 
 printf (" %d\n", pCFI->nFont);
 
 getchar ();
 return 0;
}
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
25.11.2012, 17:52
Цитата Сообщение от kravam Посмотреть сообщение
Для этих может и не видно, для других видно
Мне кажется, что именно для точечных и не видно.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
25.11.2012, 18:05  [ТС]
Arial точечный? Или, может, я не знаю, что такое точечный, так для меня всё, что не Lucida Console- всё точечное. Вот для него отлично видно страницы с разными кодировками.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
25.11.2012, 19:06
Цитата Сообщение от kravam Посмотреть сообщение
так для меня всё, что не Lucida Console- всё точечное
А для меня, всё, что имеет выбор кодировок, не точечное. Непонятно как работает надпись: "Для продолжения нажмите любую клавишу..." Если Lucida Console, то пишет правильно и когда прописана 1251 в коде, и когда не прописана. Если перейти на точечные, то пишет правильно, если не прописана 1251. Если прописать, то иероглифы.
0
26.11.2012, 14:11

Не по теме:

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.11.2012, 14:11

Что изменить, чтобы нормально выводились русские буквы?
Как изменить конкретно эту программу, чтобы русские буквы нормально выводились в файл и на экран? package coursework; import...

Почему русские мало улыбаются?
Почему русские мало улыбаются? Этот вопрос мы часто слышим от наших иностранных коллег, и это вопрос абсолютно справедливый. Русские...

Если работать через кодировку ascii то все ок, но она не воспринимает русские буквы
Написал прогу,которая кодирует и декодирует входной текст,работает она правильно за исключением одного момента: При раскодировании...

Русские буквы в консоли
всем привет! подскажите пожалуйста код для транслита, т.е. чтобы в консольке показывались русские буквы, для этого есть специальный код,...

Русские буквы в консоли
Вчера основательно начал изучать этот замечательный язык. До этого уже было знакомство с эклипсом(где-то год назад), тогда мне это все было...


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

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №3)
Maks 15.11.2026
Обновленная версия предыдущей обработки. Изменения коснулись букв: Ъ, Ы, Ь, Э, отображения которых зависят от положения реквизита "Транслитерация имён". Изменено отображение буквы Й. Добавлена. . .
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru