Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Базы данных > Кракозябры при выводе русского текста


Автор: ashtone 25.4.2013, 14:47
Вобщем пишу прогу на Visual C++ 2008...  подключаю к ней базы данных MySql (использую версию 5.5)...  так при выводе русского текста из базы получаю кракозябры вместо того что лежит в базе...  понимаю что дело в несовпадении кодировки..  но как это исправить не пойму, уже неделю бъюсь над этой проблемой...  вобщем создал 2 разные базы с 2 кодировками "cp1251" и "utf8"...  это не помогло..  как решить проблему??? или может кто скинет свой пример базы, может попробовать установить похожую кодировку?? 

Вот вариант базы с utf8 кодировкой..  вывод текста в Visual -  кракозябрами
 user posted image

А это вариант с cp1251, тескт выводится так же...  причем те же символы, вывод текста обсалютно не меняется
user posted image

Автор: bars80080 25.4.2013, 15:09
многое ещё зависит от того, как вы внесли данные. сам-то клиент mysql (командная строка) работает в кодировке cp866.
поэтому, если вы вносили данные через клиент, а смотрите в visual или вносили данные через visual, а смотрите в клиенте, то кракозябры вполне логичны

Автор: ashtone 25.4.2013, 15:22
Цитата(bars80080 @ 25.4.2013,  15:09)
многое ещё зависит от того, как вы внесли данные. сам-то клиент mysql (командная строка) работает в кодировке cp866.
поэтому, если вы вносили данные через клиент, а смотрите в visual или вносили данные через visual, а смотрите в клиенте, то кракозябры вполне логичны

Тоесть что бы у меня данные в базе лежали действительно в utf8 мне перед внесением данных в базу необходимо выполнить команду  "set character_set_client=utf8;" ??? тем самым указать что данные от клиента поступают в соответствующей кодировке...   а так, даже не зависимо от того что практически везде стоит utf8, данные лежат в cp866??...   

Данные будут поступать и при внесении из самого MySql (консоли).. и из Visual..

Данные я просматриваю через Visual...  как правильно создать базу, что бы всё отображалось как надо??  


Автор: bars80080 25.4.2013, 17:01
точно сказать не могу (вообще, не понял, как оказался в разделе С)

обычно, внесение и чтение идёт либо оттуда, либо отсюда. к примеру, если программа заточена на работу с пользователем, то к консоли его никто не подпускает

если же в общем, то для работы с базой из проги, обычно хватает указания:
Код

SET NAMES `utf8`


чтобы нормально обозреть эти данные в клиенте, надо указать вначале работы кодировку клиента:
Код

SET NAMES `cp866`


Автор: ashtone 25.4.2013, 17:40
Цитата(bars80080 @ 25.4.2013,  17:01)
точно сказать не могу (вообще, не понял, как оказался в разделе С)

обычно, внесение и чтение идёт либо оттуда, либо отсюда. к примеру, если программа заточена на работу с пользователем, то к консоли его никто не подпускает

если же в общем, то для работы с базой из проги, обычно хватает указания:
Код

SET NAMES `utf8`


чтобы нормально обозреть эти данные в клиенте, надо указать вначале работы кодировку клиента:
Код

SET NAMES `cp866`

Вот в том то и проблема....   "Set names cp1251" - не помогает...  драйвер ODBC вообще этот запрос не потдерживает, спасался  "set character_set_client=utf8;" и ему подобными, вставлял в код С++ перед открытием таблицы базы данных...  это ничем не помогало.. единстенное что менялись одни кракозябры на другие..  в самой базе все отображается как надо...

Вобщем от базы мне требуется только вывод данных..  не сортировки, не поиска по тексту не будет...  только вот с выводом текста в Visual получается огромная проблема которая практически никак не решается..



Автор: bars80080 25.4.2013, 17:45
странное дело. я конечно в ODBC не шарю, но по логике, запрос должен прямо без лишних обработок закидываться в СУБД. может есть какая функция, позволяющая напрямую пуляться в СУБД?

Автор: ashtone 25.4.2013, 18:04
Цитата(bars80080 @ 25.4.2013,  17:45)
странное дело. я конечно в ODBC не шарю, но по логике, запрос должен прямо без лишних обработок закидываться в СУБД. может есть какая функция, позволяющая напрямую пуляться в СУБД?

Функци для обращения на прямую есть....  только вот она то и не потдерживает "Set names"...  насколько я знаю "set names" это набор запросов "set character_set_client;"  и подобные...  поэтому кидаю в sql эти запросы, а именно:

character_set_client - кодировка в которой идет запрос от клиента к серверу
character_set_results - кодировка в которой отправляются ответы от сервера к клиенту
character_set_connection;

и устанавливаю для них нужную кодировку....  только всё безрезультатно...   при смене кодировок меняются только кракозябры.. а если меняются кракозябры, значит запрос работает...

Получается вся суть в правильном написании БД..




Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)