1

Добрый вечер. Возникла проблема при записи в бд mysql данных из консольной программы, написанной на Visual C++. Суть в следующем. Я получаю данные в массив. Там есть значения на английском языке и на русском. Потом эти значения записываю в таблицу mysql. Все поля таблицы имеют кодировку utf8_general_ci Английские значения пишутся без искажений, а вот с русскими беда - в базу все записывается иероглифами. Я понимаю, что изначально в Windows все хранится в 1251 кодировке. Нужно как-то это переконвертировать в UTF8. Ничего толкового, что помогло не нашел. Подскажите плиз как решить данную проблему?

  • А в чём проблема? Укажите базе, что символы в кодировке utf-8. Никогда не используйте ужас наподобие cp1251 или там koi8-r. – VladD Nov 26 '15 at 15:07
  • Если указываю , что SET NAMES utf8 , то вместо русских значений, пусто. С удовольствием бы не использовал этот ужас, но мне данные приходят в этой кодировке. – Петр Nov 26 '15 at 15:20
  • Если вам дан исчерпывающий ответ, отметьте его как верный (галка напротив выбранного ответа). – Nicolas Chabanovsky Dec 02 '15 at 12:38

1 Answers1

1

Для начала, я предостерёг бы от работы с консолью, если это только не программа для разработчиков. Если вы пишете программу для реальных клиентов — сделайте UI.

Теперь, если вы всё же хотите вводить многоязычный текст в консольную программу, вам лучше всего перейти на wstring, как описано в этом ответе.

Остаётся вопрос конвертации wstring в UTF-8. Для этого можно, например, использовать WinAPI-функцию WideCharToMultiByte с кодовой страницей CP_UTF8.

Ещё один вариант конвертации wstring в UTF-8 такой (одолжено из этого ответа):

wstring wstr = L"ля ля ля-ля-ля ля-ля-ля-ля-ля"; // ввод пользователя

std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t> wconv;
std::string utf8str = wconv.to_bytes(wstr);
VladD
  • 206,799
  • Спасибо, попробую сделать как вы написали – Петр Nov 26 '15 at 15:22
  • @Петр: Обновил ответ. – VladD Nov 26 '15 at 15:25
  • Спасибо. Буду пробовать. – Петр Nov 26 '15 at 15:48
  • ещё видел в рабочем проекте вариант просто перекодировать вручную, вполне рабочий вариант, гуглится по запросу cp2utf() – Yuriy Orlov Nov 26 '15 at 17:12
  • @YuriyOrlov: Не, это плохой вариант. Одноязычным кодировкам типа cp1251 не место в нашей вселенной в 2015 году. – VladD Nov 26 '15 at 17:14