Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.01.2013, 22:30   #1
Павел_95
Пользователь
 
Регистрация: 04.11.2012
Сообщений: 22
Смущение Проблема с кодировкой текста(С/С++)

Здравствуйте.
Целый день мучился с этой проблемой в кодировке текста... Так ничего путного и не получилось, решил написать Вам - может сталкивались или просто знаете такую ошибку.
В краце о программу: написал маленькую прогу, которая содержит массив и записывает в него какой-либо текст по-символьно. В общем все по сути работает и записывает его нормально в формат ".txt".
Но есть проблема и это факт: хоть и в самой проге при выводе массива его отображает нормально(например заполнив текстом "вот" и отображает "вот", с латинскими литерами все нормально), но когда я все это дело вывожу в текстовый документ - записывает каракули.
Я уже спрашивал помощи у умных людей, лазил целый день по интернету и немного об этом разведал. Как я понял, Windows использует старую систему кодировки (ср866 вроде), а для отображения нормально русского текста нужен стандарт ср1251. Для этого предлагали функцию setlocale(), а именно установить с её помощью нормальную кодировку: setlocale(LC_ALL, ".1251"); (или вместо .1251 я ставил "rus"("Russian")). Но, чуда не произошло(
Так же пытался вводить текст разными способами(getchar(), scanf(), cin, gets()), что результатов тоже не принесло.
Я конечно не унываю, и углубляюсь уже в глубь самой кодировки(распечатал статью Джоэла Спольски,потом почитаю на досуге), но,если честно,альтернативных вариантов я пока не придумаю.
Буду очень признателен за ответы, особенно стоящие!
Спасибо, что потратили время, прочитав весь тот бред, что я строчил от безысходности
Очень надеюсь на Вашу помощь.
Павел_95 вне форума Ответить с цитированием
Старый 12.01.2013, 22:42   #2
Павел_95
Пользователь
 
Регистрация: 04.11.2012
Сообщений: 22
По умолчанию

хотел уточнить насчет вывода: при вводе английского текста все работает отлично. при вводе именн кириллицы символы страдают. Например, при вводе строки "вот вот вот" выводит ў®в ў®в ў®в.
При просмотре кода символа, который я ввел можно увидеть, что из 4 символов кода остаются только 2, то есть 2 отбрасываются.
Компилятор работает и записывает данные в кодировке ср866.
Кстати, я забыл скинуть код, может ошибка где-то там:
Код:
#include <stdio.h>
#include <string>
#include <iostream>
using namespace std;

int main()
{system("color   F0");
setlocale(LC_ALL, ".1251"); 

 int size_0 = 0;
 char *text = new char[100];

int c;
while((c=getchar()) != EOF)
 {
	  text[size_0++] = c;
 }
      text[size_0] = '\0';

   printf("Text: %s", text);
   getchar();
   FILE* fp = fopen("pismo.txt","w"); 
if(fp != NULL) 
{ 
 printf("Idet zapis v fail&…\n"); 

for(int i=0; i < size_0; i++) 
 putc(text[i],fp); 
} 
else 
 printf("Error.\n"); 
fclose(fp); 

getchar();
return 0;
}
Такое ощущение, что функция
setlocale(LC_ALL, ".1251");
работает только для выводимого текста, то есть того, который выводится printf, cout-ами непосредственно из программы.
Павел_95 вне форума Ответить с цитированием
Старый 13.01.2013, 00:39   #3
Ezhik Kihze
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 639
По умолчанию

1. обсуждалось
2. настраивайте консоль на локаль 1251 с помощью винапи
2 либо (что у меня работает лучше) используйте wcout, wcin и их настраивайте на .866 локаль через imbue
Где-то читал, что setlocale не действует на cout.
ICQ: 677936656 Gmail: ekEmbed@gmail.com
Ezhik Kihze вне форума Ответить с цитированием
Старый 14.01.2013, 00:17   #4
Павел_95
Пользователь
 
Регистрация: 04.11.2012
Сообщений: 22
По умолчанию

Ezhik Kihze, да, вы правы!
setlocale не действует на cout и другие способы вывода текста.
Все дело в том, что для этого используются другие функции.
Может, кому будет полезна информация:
Это функции:
Код:
SetConsoleCP(1251);								//русский ввод
SetConsoleOutputCP(1251);						//русский вывод
Они описаны в библиотеке <windows.h>
Но, они поддерживают другой шрифт консоли. Вам нужно выбрать шрифт консоли(cmd) - этот: Lucida Console
Павел_95 вне форума Ответить с цитированием
Старый 14.01.2013, 01:16   #5
Ezhik Kihze
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 639
По умолчанию

На другие действует и не стоит всюду пихать ВинАПИ, с++ не только на винде бывает...
ICQ: 677936656 Gmail: ekEmbed@gmail.com
Ezhik Kihze вне форума Ответить с цитированием
Старый 14.01.2013, 08:40   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,372
По умолчанию

Вы же вроде сами сказали настроить с помощью винапи...

А мне вот интересно, почему кодировка 866 а устанавливается 1251?
waleri вне форума Ответить с цитированием
Старый 15.01.2013, 00:16   #7
Ezhik Kihze
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 639
По умолчанию

Я привел это как один из вариантов, а также уточнил, что у меня он не очень работает и лучше использовать другой.
ICQ: 677936656 Gmail: ekEmbed@gmail.com
Ezhik Kihze вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с кодировкой текста Delphi XE bagabuga Работа с сетью в Delphi 4 27.02.2012 22:02
Проблема с кодировкой именно при сохранении текста в БД. Leximus БД в Delphi 0 16.02.2012 11:56
Проблемы с кодировкой текста в Windows XP Ivan_32 Общие вопросы по Java, Java SE, Kotlin 2 10.11.2010 21:18
трабла с кодировкой текста MyLastHit Общие вопросы Delphi 10 23.08.2010 17:38
Неполадки с кодировкой русского текста. 3dgraph HTML и CSS 3 14.07.2009 19:26