Получение данных UTF-8 из MySQL в приложение Linux C ++ - PullRequest
2 голосов
/ 09 октября 2009

У меня большие проблемы с отображением данных UTF-8, извлеченных из MySQL в приложение C ++ на основе Linux. Текст UTF отображается в виде вопросительных знаков.

Приложение использует MySQL C API. Поэтому я передал опцию UTF-8 после mysql_init() и до mysql_real_connect():

mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, 'utf8');

и

mysql_options(&mysql,MYSQL_INIT_COMMAND, 'SET NAMES utf8');

Но без удачи. Тест по-прежнему отображается в виде вопросительных знаков. Я сделал несколько тестов со скриптом Perl (я более знаком с ним;)). И текст отображается правильно, если я укажу опцию UTF-8 для соединения:

$dbh->{'mysql_enable_utf8'} = 1;
$dbh->do('SET NAMES utf8');

Есть идеи, как правильно отображать данные UTF-8 в приложении C ++?

Ответы [ 2 ]

6 голосов
/ 25 февраля 2013

Это может быть простая опечатка. Вы пишете:

mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, 'utf8');

Одинарные кавычки предназначены для указания символьных литералов, а не строк. Итак, измените это на:

mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "utf8");

Также проверьте тип mysql. Если это MYSQL *, то напишите:

mysql_options(mysql, MYSQL_SET_CHARSET_NAME, "utf8");

То же самое относится к строке с MYSQL_INIT_COMMAND.

3 голосов
/ 09 октября 2009

Вам не нужно настраивать параметры набора символов таким образом, чтобы получить желаемый результат. Они просто помогают БД делать разумные вещи с сортировкой и тому подобное.

Я подозреваю, что вы действительно получаете данные в формате UTF-8, но просто неправильно обрабатываете их. Прохождение UTF-8 в C - самая легкая вещь в мире. Получение правильной распечатки может быть более сложной задачей, но, конечно, это не проблема MySQL.

Исходя из того, что вы пометили этот пост, я предполагаю, что вы запускаете эту программу в Linux. Если это так, вы должны просто иметь возможность распечатать его на консоли (printf (), cout, что угодно), чтобы получить правильное представление, так как консоли Linux почти всегда по умолчанию используют UTF-8 в наши дни. Проверьте переменную среды LANG.

При работе с Unicode может быть полезно написать тестовые программы, которые получают очень небольшое количество данных, не относящихся к ASCII, - лучше всего один символ - выводить только это и перенаправлять вывод этой программы в файл. , Затем посмотрите на файл в шестнадцатеричном редакторе и сравните его, по крайней мере, с UCS-2LE, чтобы убедиться, что вы видите неправильную кодировку.

Я поддерживаю MySQL ++ и могу сказать вам, что MySQL ++ вполне естественно работает с UTF-8 в Linux, но мы не играем в какие-либо игры, чтобы заставить это сделать это. Я не понимаю, почему простой код C API не должен вести себя так же естественно. Вы можете попробовать собрать MySQL ++ в своей системе и запустить примеры, так как они включают тесты UTF-8. Запустите resetdb для настройки, затем simple1, чтобы показать данные UTF-8, которые resetdb поместил в тестовую базу данных. См. README-examples.txt в дистрибутиве для получения более подробной информации.

Я не говорю вам переключаться на MySQL ++, просто использую это в качестве известного рабочего теста. Как только вы заработаете, вы можете либо изменить эти примеры, чтобы они работали с вашей собственной БД, чтобы посмотреть, не сломается ли она тогда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...