Кирилица из базы данных MySQL выводится в виде краказабр.
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.0] |
|
|
Правила раздела C/C++: Базы данных
| Страницы: (2) 1 [2] все ( Перейти к последнему сообщению ) |
Кирилица из базы данных MySQL выводится в виде краказабр.
|
Сообщ.
#16
,
|
|
|
|
Да. Не ту dll скопировал.
https://disk.yandex.ru/d/SeeyjYHWH9gRmA Надо заменить в school\x64\Debug там сейчас лежит релизная dll |
|
Сообщ.
#17
,
|
|
|
|
Цитата sharky72 @ Да. Не ту dll скопировал. https://disk.yandex.ru/d/SeeyjYHWH9gRmA Надо заменить в school\x64\Debug там сейчас лежит релизная dll Спасибо большое, все работает. |
|
|
|
|
|
И снова здравствуйте!
Вопрос тот же, только на оборот. Подскажите, пожалуйста, как внести данные в базу в кодировке utf8? ![]() ![]() // Конвертация в гарантированно валидный UTF-8 (замена невалидных символов) std::string to_valid_utf8(const std::string& str, char replacement = '?') { std::string result; result.reserve(str.length()); for (size_t i = 0; i < str.length();) { uint8_t c = static_cast<uint8_t>(str[i]); try { if ((c & 0x80) == 0x00) { // 1 byte: 0xxxxxxx result += str[i++]; } else if ((c & 0xE0) == 0xC0) { // 2 bytes: 110xxxxx if (i + 1 >= str.length()) throw std::exception(); uint8_t c2 = static_cast<uint8_t>(str[i + 1]); if ((c2 & 0xC0) != 0x80) throw std::exception(); result += str[i]; result += str[i + 1]; i += 2; } else if ((c & 0xF0) == 0xE0) { // 3 bytes: 1110xxxx if (i + 2 >= str.length()) throw std::exception(); uint8_t c2 = static_cast<uint8_t>(str[i + 1]); uint8_t c3 = static_cast<uint8_t>(str[i + 2]); if ((c2 & 0xC0) != 0x80 || (c3 & 0xC0) != 0x80) throw std::exception(); result += str[i]; result += str[i + 1]; result += str[i + 2]; i += 3; } else if ((c & 0xF8) == 0xF0) { // 4 bytes: 11110xxx if (i + 3 >= str.length()) throw std::exception(); uint8_t c2 = static_cast<uint8_t>(str[i + 1]); uint8_t c3 = static_cast<uint8_t>(str[i + 2]); uint8_t c4 = static_cast<uint8_t>(str[i + 3]); if ((c2 & 0xC0) != 0x80 || (c3 & 0xC0) != 0x80 || (c4 & 0xC0) != 0x80) throw std::exception(); result += str[i]; result += str[i + 1]; result += str[i + 2]; result += str[i + 3]; i += 4; } else { throw std::exception(); // Невалидный байт } } catch (...) { result += replacement; i++; // Пропускаем невалидный байт } } return result; } // ... int addChoice; if (cin >> addChoice) { switch (addChoice) { case 1: { system("cls"); cout << u8"=== ДОБАВЛЕНИЕ ОДНОГО УЧАЩЕГОСЯ ===" << endl; string group, name, sex, teleg_id, teleg_nickname; int age; cin.ignore(); // очищаем буфер cout << u8"Введите группу: "; getline(cin, group); cout << u8"Введите ФИО: "; getline(cin, name); cout << u8"Введите пол (м/ж): "; getline(cin, sex); cout << u8"Введите возраст: "; cin >> age; cin.ignore(); // очищаем буфер после числа cout << u8"Введите Telegram ID: "; getline(cin, teleg_id); cout << u8"Введите Telegram никнейм: "; getline(cin, teleg_nickname); // Формируем SQL запрос для добавления string sql = "INSERT INTO learners (_group, name, sex, age, teleg_id, teleg_nickname) VALUES ('" + group + "', '" + to_valid_utf8(name) + "', '" + to_valid_utf8(sex) + "', " + to_string(age) + ", '" + teleg_id + "', '" + to_valid_utf8(teleg_nickname) + "')"; try { db.executeQuery(sql); cout << u8"✅ Учащийся успешно добавлен!" << endl; } catch (const exception& e) { cout << u8"❌ Ошибка при добавлении: " << e.what() << endl; } cout << "\n" << std::string(50, '=') << endl; cout << u8"Нажмите Enter для продолжения..."; cin.get(); break; } // ... Прикреплённая картинка
|
|
Сообщ.
#19
,
|
|
|
|
Так же. Только через обратное преобразование Unicode -> UTF8. Т.е. std::wstring -> WideCharToMultiByte -> std::string -> query to database
Тут надо определиться в какой кодировке исходные данные. По хорошему приложение должно быть юникодным и все locale-depended данные должны быть в wstring (CStringW) Иначе надо будет делать двойное преобразование. std::string, char (MB CP1251 (кириллица)) -> MultiByteToWideChar -> Unicode (std::wstring, wchar_t) -> WideCharToMultiByte -> std::string, char (MB UTF8) |