ВСЕМ ПОЛЬЗОВАТЕЛЯМ И ПРОГРАММИСТАМ СЮДА!

Флейм в чистом виде - все что угодно...
Но - в рамках закона :)
Ответить
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

Итак. Теперь у меня проблема.
Имеем базу MySQL. В ней огромная таблица в кодировке CP1251.
Выполняем к ней запрос и вытаскиваем данные, записанные кириллицей.
За тем отображаем данные в консольном приложении:

Код: Выделить всё

char cod[20], tel[20], name[100], selo[50], street[100], home[20], ap[20];

//*****************************
void display(char text[1000])
{
	char disp[1000];
	CharToOem(text, disp);
	printf("%s\n", disp);
}

//*****************************
void main(void)
{
......//Запросы в БД и прочее.
..............
..................
.....

//Тут мы выводим результат на экран.

		sprintf(out, "Код: %s", cod);
		display(out);
		sprintf(out, "Телефон: %s", tel);
		display(out);
		sprintf(out, "Владелец: %s", name);
		display(out);
		sprintf(out, "Населённый пункт: %s", selo);
		display(out);
		sprintf(out, "Улица: %s", street);
		display(out);
		sprintf(out, "Дом: %s", home);
		display(out);
		sprintf(out, "Квартира: %s", ap);
		display(out);
		_getch();
}
В итоге получаем это: :kill: :kill: :kill:
Изображение

Как с этим бороться? Такие записи, как:

Код: Выделить всё

	setlocale( LC_ALL,".1251" );

	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);

	system("chcp 1251");
...... не помогают. Помогите ламеру. :oops: :oops: :))) :)))
Последний раз редактировалось DX168B Пт фев 18, 2011 04:06:56, всего редактировалось 1 раз.
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Сообщения: 2108
Зарегистрирован: Пт авг 29, 2008 16:28:19
Откуда: Киев

Сообщение Foks »

http://msdn.microsoft.com/en-us/library ... 85%29.aspx
Попробуйте сконвертировать строки этой функцией. С русскими буквами кажется (давно это было) работало, с украинскими нет.
Giggity giggity goo!
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

CharToOem() есть у меня в функции dislplay(char *text);
Там, выше main'А. :) Или предлагаете обработать каждую переменную в отдельности, потом слепить их уже в строки через sprintf() и вывести на экран?
Гугл попутного ничего не дал.

ЗЫ: Где-то вычитал, что в PHP существует
такая-же проблема - CP1251 тоже отображается знаками ???
Главное то, что латиница, знаки препинания и цифры определяются нормально.
Только именно кириллица заменяется на ??????. Ваши идеи?
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 2108
Зарегистрирован: Пт авг 29, 2008 16:28:19
Откуда: Киев

Сообщение Foks »

Для начала - с запросами из базы порядок? После подключения к базе устанавливаете кодировку подключения и кодировку запросов в cp1251? Обычно это нужно делать.
Giggity giggity goo!
Реклама
Эиком - электронные компоненты и радиодетали
Грызет канифоль
Сообщения: 299
Зарегистрирован: Чт ноя 25, 2010 12:15:42
Откуда: Украина, Киев

Сообщение vova2010 »

Попробуй подключить файл кeyrus.com
В свое время для доса и в ранних версиях виндовс он был необходим для распознавания кирилицы. Например благодаря ему в досовском текстовом редакторе лексикон можно было работать с русским языком нормально, а некоторые буквы украинскго языка воспринимались криво.
Реклама
Поставщик валерьянки для Кота
Сообщения: 2108
Зарегистрирован: Пт авг 29, 2008 16:28:19
Откуда: Киев

Сообщение Foks »

keyrus.com здесь не при чем, т.к. поддержка кириллицы есть, и есть функция для преобразования кодировки (CharToOem).

Попробуйте вывести строки, прочитанные из базы, в текстовый файл, но только без своих русскоязычных символов. Исключительно то что прочитано. Затем откройте например через Notepad++, если там будут знаки вопроса, значит у Вас проблема с чтением из базы, иначе проблема с выводом.
Giggity giggity goo!
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ну что вы советуете неизвестно что... в консоли винды используется кодировка DOS, т.е. 866-я кодовая страница (если не ошибаюсь), а в самой винде - 1251-я. вот и все. перед выводом преобразовать строки в другую кодировку - и проблемы нет. но лучше - отказаться от консоли и делать для винды виндовое приложение :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Сообщения: 6900
Зарегистрирован: Ср май 05, 2010 13:31:29

Сообщение А.Андрей »

Попробуйте без неё (CharToOem) с этим.
DX168B писал(а):

Код: Выделить всё

	setlocale( LC_ALL,".1251" );

	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);

	system("chcp 1251");
Foks писал(а):Попробуйте вывести строки, прочитанные из базы, в текстовый файл, но только без своих русскоязычных символов. Исключительно то что прочитано. Затем откройте например через Notepad++, если там будут знаки вопроса, значит у Вас проблема с чтением из базы.
Во-во. Возможно.
Или же конвертирующая функция принимает юникод а на вход подается ansi. В таком случае нужна MultiByteToWideChar или же WideCharToMultiByte если наблюдается обратное. Потом попробовать CharToOem или же не использовать её а юзать вышеуказанный фрагмент.
Я не знаток си, а потому могу нести полнейшую ахинею( просьба не пинать) Наверное потребуется ассемблерная вставка.
ARV писал(а):делать для винды виндовое приложение
Дак там тож 866-ая :kill:
Спасибо за внимание.
Друг Кота
Сообщения: 6900
Зарегистрирован: Ср май 05, 2010 13:31:29

Сообщение А.Андрей »

DX168B писал(а):Или предлагаете обработать каждую переменную в отдельности, потом слепить их уже в строки через sprintf() и вывести на
А это нафига?
Спасибо за внимание.
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Дак там тож 866-ая
С чего это? Много лет уж 1251...
Друг Кота
Сообщения: 6900
Зарегистрирован: Ср май 05, 2010 13:31:29

Сообщение А.Андрей »

ploop писал(а):
Дак там тож 866-ая
С чего это? Много лет уж 1251...
Ага, блин :kill:
Только в диалогах(messagebox) нажно ставить досовскую кирилицу :kill:
Спасибо за внимание.
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

Нифига не получается. :kill: Пишу в VS6.0 английская версия.
Проверю в 2008й русской версии. Позже отпишусь о результатах.
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 2108
Зарегистрирован: Пт авг 29, 2008 16:28:19
Откуда: Киев

Сообщение Foks »

DX168B писал(а):Нифига не получается. :kill: Пишу в VS6.0 английская версия.
Проверю в 2008й русской версии. Позже отпишусь о результатах.
Прочитанные строки в текстовый файл выводить пробовали? Без CharToOem().
DX168B, пожалуйста, по-детальнее описывайте Ваши действия и результаты. Не имею возможности проверить/отладить, т.к. нету установленной винды.

ARV, а сами то что советуете? :roll: Кодировку из cp1251 в oem866 он уже успешно преобразовал с помощью функции CharToOem(). Теперь вопрос в том, что из базы читается что-то, явно не в кодировке 1251.
Giggity giggity goo!
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

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

Код: Выделить всё

		mysql_query(&mysql, "SET NAMES cp1251");
Тем самым я указал серверу, что кодировка запросов и возвращаемых данных будет CP1251.
Вот результат:
Изображение
Особенность сервера в том, что если не указать ему кодировку, то он по умолчанию использует кодировку latin1. Если кодировка небыла изменена, то он будет конвертировать возвращаемые данные в latin1 независимо от того, в какой кодировке данные в таблицах. Если данные в таблицах закодированы под CP1251 или под что-то другое, то сервер конвертнёт все свои ответы в кодировку соединения. Вот такие пЕроги. :))) :))) :)))

Да Foks, вы были правы на счёт установки кодировки соединения. :)
Вложения
SCREEN.PNG
(8.51 КБ) 631 скачивание
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 2108
Зарегистрирован: Пт авг 29, 2008 16:28:19
Откуда: Киев

Сообщение Foks »

Искренне рад за Вас :)
Можно так же поменять дефолтную в my.ini, но более надежный способ - такой как Вы реализовали :)
Giggity giggity goo!
Друг Кота
Сообщения: 6900
Зарегистрирован: Ср май 05, 2010 13:31:29

Сообщение А.Андрей »

Слава богу! :)
Спасибо за внимание.
Родился
Сообщения: 4
Зарегистрирован: Пт фев 18, 2011 22:55:37

Сообщение aeroplan-t50 »

DX168B писал(а): <кусь - кусь>

Код: Выделить всё

 <кусь - кусь>
	while((row = mysql_fetch_row(res))) 
 <кусь - кусь>

Это ещё изврааат
Согласен, - использовать в качестве условия присвоение (точнее, результат возвращаемый присвоением) - на это только С способен.
Поставщик валерьянки для Кота
Сообщения: 2108
Зарегистрирован: Пт авг 29, 2008 16:28:19
Откуда: Киев

Сообщение Foks »

Только это не изврат, а знание языка программирования. (без иронии).
Последний раз редактировалось Foks Пн фев 21, 2011 08:53:54, всего редактировалось 1 раз.
Giggity giggity goo!
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

А чего там плохого. У меня работает. Выход из цикла происходит как раз после полной обработки динамической структуры row. И не раньше и не позже. Тем более while позволяет такие приёмы. :)
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Друг Кота
Сообщения: 6900
Зарегистрирован: Ср май 05, 2010 13:31:29

Сообщение А.Андрей »

Нестандартно! +100 :)
Спасибо за внимание.
Ответить

Вернуться в «МЯЯЯУ!»