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

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

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

Сообщение 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!
Foks
Поставщик валерьянки для Кота
Сообщения: 2108
Зарегистрирован: Пт авг 29, 2008 16:28:19
Откуда: Киев

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

Сообщение Foks »

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

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

Сообщение DX168B »

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

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

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

Сообщение Foks »

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

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

Сообщение vova2010 »

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

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

Сообщение Foks »

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

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

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

Сообщение ARV »

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

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

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

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

Попробуйте без неё (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

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

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

DX168B писал(а):Или предлагаете обработать каждую переменную в отдельности, потом слепить их уже в строки через sprintf() и вывести на

А это нафига?
Спасибо за внимание.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

Дак там тож 866-ая

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

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

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

ploop писал(а):
Дак там тож 866-ая

С чего это? Много лет уж 1251...

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

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

Сообщение DX168B »

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

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

Сообщение Foks »

DX168B писал(а):Нифига не получается. :kill: Пишу в VS6.0 английская версия.
Проверю в 2008й русской версии. Позже отпишусь о результатах.

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

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

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

Сообщение DX168B »

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

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

      mysql_query(&mysql, "SET NAMES cp1251");

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

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

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

Сообщение Foks »

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

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

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

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

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

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

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

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

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



Это ещё изврааат


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

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

Сообщение Foks »

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

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

Сообщение DX168B »

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

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

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

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

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