Страница 8 из 12

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

Добавлено: Пт фев 18, 2011 03:45:38
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: :))) :)))

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

Добавлено: Пт фев 18, 2011 03:48:58
Foks
http://msdn.microsoft.com/en-us/library ... 85%29.aspx
Попробуйте сконвертировать строки этой функцией. С русскими буквами кажется (давно это было) работало, с украинскими нет.

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

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

ЗЫ: Где-то вычитал, что в PHP существует
такая-же проблема - CP1251 тоже отображается знаками ???
Главное то, что латиница, знаки препинания и цифры определяются нормально.
Только именно кириллица заменяется на ??????. Ваши идеи?

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

Добавлено: Пт фев 18, 2011 04:56:17
Foks
Для начала - с запросами из базы порядок? После подключения к базе устанавливаете кодировку подключения и кодировку запросов в cp1251? Обычно это нужно делать.

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

Добавлено: Пт фев 18, 2011 05:07:10
vova2010
Попробуй подключить файл кeyrus.com
В свое время для доса и в ранних версиях виндовс он был необходим для распознавания кирилицы. Например благодаря ему в досовском текстовом редакторе лексикон можно было работать с русским языком нормально, а некоторые буквы украинскго языка воспринимались криво.

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

Добавлено: Пт фев 18, 2011 11:10:51
Foks
keyrus.com здесь не при чем, т.к. поддержка кириллицы есть, и есть функция для преобразования кодировки (CharToOem).

Попробуйте вывести строки, прочитанные из базы, в текстовый файл, но только без своих русскоязычных символов. Исключительно то что прочитано. Затем откройте например через Notepad++, если там будут знаки вопроса, значит у Вас проблема с чтением из базы, иначе проблема с выводом.

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

Добавлено: Пт фев 18, 2011 12:50:04
ARV
ну что вы советуете неизвестно что... в консоли винды используется кодировка DOS, т.е. 866-я кодовая страница (если не ошибаюсь), а в самой винде - 1251-я. вот и все. перед выводом преобразовать строки в другую кодировку - и проблемы нет. но лучше - отказаться от консоли и делать для винды виндовое приложение :)))

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

Добавлено: Пт фев 18, 2011 14:22:06
А.Андрей
Попробуйте без неё (CharToOem) с этим.
DX168B писал(а):

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

	setlocale( LC_ALL,".1251" );

	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);

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

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

Добавлено: Пт фев 18, 2011 14:26:42
А.Андрей
DX168B писал(а):Или предлагаете обработать каждую переменную в отдельности, потом слепить их уже в строки через sprintf() и вывести на
А это нафига?

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

Добавлено: Пт фев 18, 2011 14:33:28
ploop
Дак там тож 866-ая
С чего это? Много лет уж 1251...

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

Добавлено: Пт фев 18, 2011 14:35:42
А.Андрей
ploop писал(а):
Дак там тож 866-ая
С чего это? Много лет уж 1251...
Ага, блин :kill:
Только в диалогах(messagebox) нажно ставить досовскую кирилицу :kill:

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

Добавлено: Пт фев 18, 2011 15:32:27
DX168B
Нифига не получается. :kill: Пишу в VS6.0 английская версия.
Проверю в 2008й русской версии. Позже отпишусь о результатах.

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

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

ARV, а сами то что советуете? :roll: Кодировку из cp1251 в oem866 он уже успешно преобразовал с помощью функции CharToOem(). Теперь вопрос в том, что из базы читается что-то, явно не в кодировке 1251.

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

Добавлено: Пт фев 18, 2011 23:37:50
DX168B
Итак.... Проблема решена.
Необходимо было добавить, сразу после подключения к серверу MySQL, строчку:

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

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

Да Foks, вы были правы на счёт установки кодировки соединения. :)

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

Добавлено: Сб фев 19, 2011 00:04:14
Foks
Искренне рад за Вас :)
Можно так же поменять дефолтную в my.ini, но более надежный способ - такой как Вы реализовали :)

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

Добавлено: Сб фев 19, 2011 12:52:58
А.Андрей
Слава богу! :)

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

Добавлено: Вс фев 20, 2011 20:02:01
aeroplan-t50
DX168B писал(а): <кусь - кусь>

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

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

Это ещё изврааат
Согласен, - использовать в качестве условия присвоение (точнее, результат возвращаемый присвоением) - на это только С способен.

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

Добавлено: Вс фев 20, 2011 23:09:41
Foks
Только это не изврат, а знание языка программирования. (без иронии).

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

Добавлено: Вс фев 20, 2011 23:43:10
DX168B
А чего там плохого. У меня работает. Выход из цикла происходит как раз после полной обработки динамической структуры row. И не раньше и не позже. Тем более while позволяет такие приёмы. :)

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

Добавлено: Вт фев 22, 2011 18:42:56
А.Андрей
Нестандартно! +100 :)