这是我的代码
#include <iostream>
#include <sqlite3.h>
#include <string>
#include <locale>
#include <codecvt>
#include <Windows.h>
using namespace std;
void CreateTable(int open, sqlite3* db, char* ERR)
{
cout << "Создание таблицы: ";
const char* SQLTable = "CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT NOT NULL, Age INTEGER);";
open = sqlite3_exec(db, SQLTable, 0, 0, &ERR);
if (open)
{
cerr << RED << "ПРОВАЛ" << ERR << endl << RESET;
sqlite3_free(ERR);
}
else
cout << GREEN << "УСПЕХ" << RESET << endl;
}
void SetDB(sqlite3* db, const wstring& name, int age, sqlite3_stmt** stmt)
{
const char* insertSQL = "INSERT INTO users (Name, Age) VALUES (?, ?)";
if (sqlite3_prepare_v2(db, insertSQL, -1, stmt, nullptr) == SQLITE_OK)
{
// Используем sqlite3_bind_text16 для вставки wstring
sqlite3_bind_text16(*stmt, 1, name.c_str(), -1, SQLITE_STATIC);
sqlite3_bind_int(*stmt, 2, age);
if (sqlite3_step(*stmt) != SQLITE_DONE)
cerr << "Вставка данных: " << RED << "ПРОВАЛ" << endl << sqlite3_errmsg(db) << RESET;
else
cout << "Вставка данных: " << GREEN << "УСПЕХ" << endl << RESET;
}
else
{
cerr << "Подготовка запроса: " << RED << "ПРОВАЛ" << RESET << endl;
}
sqlite3_finalize(*stmt);
}
int main()
{
SetConsoleCP(65001);
SetConsoleOutputCP(65001);
setlocale(LC_ALL, "ru");
wstring name;
int age;
sqlite3_stmt* stmt = nullptr;
sqlite3* db;
char* ErrorMsg = 0;
int open_db = sqlite3_open("test.db", &db);
ERRORsql(open_db, db);
CreateTable(open_db, db, ErrorMsg);
cout << "Начните ввод для информации в бд" << endl <<
"Для завершения работы пропишите //exit" << endl;
while (true)
{
cout << "Имя: " << endl << ">> ";
getline(wcin, name);
if (name == L"//exit")
break;
cout << "Возраст (по желанию или же -)" << endl << ">> ";
cin >> age;
SetDB(db, name, age, &stmt);
}
cout << "До скорых встреч" << endl;
sqlite3_close(db);
}
由于某种原因,当我尝试使用俄语在数据库中输入名称时,“名称”列只是空的(字面意思是空的),尽管在其他列中输入了信息。据我了解,这是编码的问题。然而,在尝试了目前我能做的一切之后,我没有成功。请不要批评太多,因为我刚刚开始学习C++,提前谢谢你! ^^
我更改了 Windows 控制台本身的编码并尝试使用 wstring;我通过 SetConsoleCP 设置了各种编码,但没有任何帮助。
我想我已经解决了我的问题,如果有人也有这样的问题,那么这就是我首先做的,我想如果我不运行.cpp文件本身,而是运行编译后的one.exe,那么整个俄语本例中的语言开始以 utf-8 编码编写并正确输入到数据库中。另外,为了正确输出到控制台,我在主函数中添加了以下代码
setlocale(LC_ALL, "ru");
SetConsoleCP(65001);
SetConsoleOutputCP(65001);
如果你遵循我的方法,一切都会正常,尽管我知道如果有其他解决方案,很可能有一些方法可以让 IDE 正常工作,我会很乐意倾听他们的意见,并感谢所有试图提供帮助的人