Windows下C++控制台与SQLite交互的UTF-8字符格式不一致问题
Windows下C++控制台与SQLite交互的UTF-8希腊字符输入输出问题
问题背景
开发Windows平台下的C++控制台小应用,需与包含希腊字母等UTF-8字符的SQLite数据库交互,实现这类字符的控制台输入、查询及输出,计划用getline或_getch处理输入。
异常现象
- 设置
SetConsoleOutputCP(CP_UTF8)和SetConsoleCP(CP_UTF8)后,输入字符串长度正确,但所有字符均为null,输入输出完全异常。 - 切换到希腊语码页1253时,控制台输入输出显示正常,但调试器中字符串值异常,每个字符仅占1字节,用该输入构造的SQLite查询无法返回结果。
- 硬编码的UTF-8字符串字面量(如
u8"Γειά σας")能正常构造SQL查询并返回结果,调试器显示正常(每个字符占2字节);在1253码页下输出乱码,切换回CP_UTF8后输出正确。 - 替换
cin为getline或_getch,问题依旧。 - 补充:终端本身无问题,设置正确ConsoleCP可正常输入输出希腊字母;调用
setlocale(LC_ALL, "")会破坏原有正常场景,输入“ΑΒΓ”会变成“ΑΑΑ”,且字面量输出乱码。
最小复现代码
#include <iostream> #include<string> #include<windows.h> using namespace std; int main() { SetConsoleOutputCP(CP_UTF8); SetConsoleCP(CP_UTF8); // 失效的输入 string input1; cout << "Enter greek letters: "; cin >> input1; cout << "You entered: " << input1 << endl; // input1长度正确但所有字符为null SetConsoleOutputCP(1253); SetConsoleCP(1253); // 正常的输入输出 string input2; cout << "Enter greek letters: "; cin >> input2; cout << "You entered: " << input2 << endl; // 输出正常 // 在1253码页下打印字面量 string literall = u8"Γειά σας"; cout << "Literal under 1253: " << literall << endl; // 乱码 // 在CP_UTF8下打印字面量 SetConsoleOutputCP(CP_UTF8); cout << "Literal under CP_UTF8: " << literall << endl; // 输出正确 return 0; }
需求
需要实现以SQLite所需的UTF-8格式输入字符,或完成1253码页字符串到UTF-8格式的转换。
内容的提问来源于stack exchange,提问作者andy dexter
相关产品推荐
相关产品推荐

