На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела C/C++: Базы данных
Модераторы: B.V.
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
    > Кирилица из базы данных MySQL выводится в виде краказабр.
      Да. Не ту dll скопировал.
      https://disk.yandex.ru/d/SeeyjYHWH9gRmA
      Надо заменить в school\x64\Debug там сейчас лежит релизная dll
      Сообщение отредактировано: sharky72 -
        Цитата sharky72 @
        Да. Не ту dll скопировал.
        https://disk.yandex.ru/d/SeeyjYHWH9gRmA
        Надо заменить в school\x64\Debug там сейчас лежит релизная dll

        Спасибо большое, все работает.
          И снова здравствуйте!
          Вопрос тот же, только на оборот. Подскажите, пожалуйста, как внести данные в базу в кодировке utf8?

          ExpandedWrap disabled
            // Конвертация в гарантированно валидный 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;
                                                }
            // ...

          Прикреплённая картинка
          Прикреплённая картинка
            Так же. Только через обратное преобразование 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)
            Сообщение отредактировано: sharky72 -
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0270 ]   [ 18 queries used ]   [ Generated: 3.11.25, 21:09 GMT ]