Добрый вечер. Возникла проблема при записи в бд mysql данных из консольной программы, написанной на Visual C++. Суть в следующем. Я получаю данные в массив. Там есть значения на английском языке и на русском. Потом эти значения записываю в таблицу mysql. Все поля таблицы имеют кодировку utf8_general_ci Английские значения пишутся без искажений, а вот с русскими беда - в базу все записывается иероглифами. Я понимаю, что изначально в Windows все хранится в 1251 кодировке. Нужно как-то это переконвертировать в UTF8. Ничего толкового, что помогло не нашел. Подскажите плиз как решить данную проблему?
Asked
Active
Viewed 141 times
1
-
А в чём проблема? Укажите базе, что символы в кодировке 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 Answers
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
-
-
-
-
ещё видел в рабочем проекте вариант просто перекодировать вручную, вполне рабочий вариант, гуглится по запросу
cp2utf()– Yuriy Orlov Nov 26 '15 at 17:12 -
@YuriyOrlov: Не, это плохой вариант. Одноязычным кодировкам типа cp1251 не место в нашей вселенной в 2015 году. – VladD Nov 26 '15 at 17:14