Страница 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();
}
В итоге получаем это:
Как с этим бороться? Такие записи, как:
Код: Выделить всё
setlocale( LC_ALL,".1251" );
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
system("chcp 1251");
...... не помогают. Помогите ламеру.

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-ая

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...
Ага, блин
Только в диалогах(messagebox) нажно ставить досовскую кирилицу

Re: ВСЕМ ПОЛЬЗОВАТЕЛЯМ И ПРОГРАММИСТАМ СЮДА!
Добавлено: Пт фев 18, 2011 15:32:27
DX168B
Нифига не получается.

Пишу в VS6.0 английская версия.
Проверю в 2008й русской версии. Позже отпишусь о результатах.
Re: ВСЕМ ПОЛЬЗОВАТЕЛЯМ И ПРОГРАММИСТАМ СЮДА!
Добавлено: Пт фев 18, 2011 21:17:09
Foks
DX168B писал(а):Нифига не получается.

Пишу в VS6.0 английская версия.
Проверю в 2008й русской версии. Позже отпишусь о результатах.
Прочитанные строки в текстовый файл выводить пробовали? Без CharToOem().
DX168B, пожалуйста, по-детальнее описывайте Ваши действия и результаты. Не имею возможности проверить/отладить, т.к. нету установленной винды.
ARV, а сами то что советуете?
Кодировку из cp1251 в oem866 он уже успешно преобразовал с помощью функции CharToOem(). Теперь вопрос в том, что из базы читается что-то, явно не в кодировке 1251.
Re: ВСЕМ ПОЛЬЗОВАТЕЛЯМ И ПРОГРАММИСТАМ СЮДА!
Добавлено: Пт фев 18, 2011 23:37:50
DX168B
Итак.... Проблема решена.
Необходимо было добавить, сразу после подключения к серверу MySQL, строчку:
Тем самым я указал серверу, что кодировка запросов и возвращаемых данных будет 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
