You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 12:17:15