MALOUDA-PSA 2025-03-17 19:25 采纳率: 85.6%
浏览 6

c++关于编码的问题2


 
    std::vector<stkvec> stkvecs1 = {
        {"301598", "黄山谷捷"}
    };
 
    std::string text22 = "这里是一些包含股票名称的文本,比如黄山谷捷。";
 
    std::vector<std::string> matches = findMatchesWithRegex(stkvecs1, text22);

这里在VS调试的时候显示为中文可识别, 可是如果从MYSQL 读取UTF8mb4的列到容器后就是乱码了:

bool FetchDataVecFromMySQL(MYSQL* conn) {
    MYSQL_RES* res = nullptr;
    MYSQL_ROW row;
 
    if (conn == NULL) {
        fprintf(stderr, "Connection is null\n");
        return false;
    }
 
    // 设置字符集选项
    mysql_options(conn, MYSQL_SET_CHARSET_NAME, "utf8mb4");
 
    if (mysql_set_character_set(conn, "utf8mb4")) {
        fprintf(stderr, "mysql_set_character_set() failed: %s\n", mysql_error(conn));
        return false;
    }
 
    // 确保客户端与服务器之间通信使用utf8mb4字符集
    if (mysql_query(conn, "SET NAMES utf8mb4;")) {
        fprintf(stderr, "Error setting names to utf8mb4: %s\n", mysql_error(conn));
        return false;
    }
 
    const char* query = "SELECT stkcode,stkname FROM fxj where stkcode like '30158%'; ";
    if (mysql_query(conn, query)) {
        fprintf(stderr, "SELECT query error: %s\n", mysql_error(conn));
        return false;
    }
 
    res = mysql_store_result(conn);
 

 
    if (res) {
        // 设置全局区域设置为UTF-8
        std::setlocale(LC_ALL, "en_US.utf8");
 
        while ((row = mysql_fetch_row(res)) != NULL) {
            std::string stkcode = row[0] ? row[0] : "";
            std::string stkname = row[1] ? row[1] : "";
 
            // 打印原始字节以调试
            printf("Raw bytes for stkname: ");
            for (unsigned char c : stkname) {
                printf("%02x ", c);
            }
            printf("\n");
 
            // 使用wprintf进行宽字符输出
            wchar_t w_stkname[256];
            mbstowcs(w_stkname, stkname.c_str(), stkname.size());
            wprintf(L"stkcode: %hs, stkname: %ls\n", stkcode.c_str(), w_stkname);  // 这里在控制台可以显示正确的编码
 
            stkvec vec;
            vec.stkcode = row[0] ? row[0] : "";
            vec.stkname = row[1] ? row[1] : "";
 
            stkvecs.push_back(vec);
        }
        mysql_free_result(res);
    }
 
    return true;
}
 
 

wprintf(L"stkcode: %hs, stkname: %ls\n", stkcode.c_str(), w_stkname); // 这里在控制台可以显示正确的编码,说明读取没有问题,
VS2019 项目编码是unicode, 现在的问题是stkvecs1 是什么编码? 是 UTF8吗?

        stkvecs.push_back(vec);  这个里面的 vec 编码是什么怎么和字面量一致? 
  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2025-03-17 19:25
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    问题解答

    你遇到了 C++ 编码问题,具体来说是关于 std::vector 和字符串的使用。

    问题的关键是你使用了 std::vector 来存储一个字符串数组,但是你没有指定字符串数组的类型。

    解决方案是使用 std::vector<std::string> 来存储字符串数组:

    std::vector<std::string> stkvecs1 = {
        "301598", "黄山谷捷"
    };
    

    这样,stkvecs1 就是一个字符串数组,可以使用 at() 方法访问每个字符串。

    如果你想要存储结构体数组,可以使用 std::vector<YourStruct>,其中 YourStruct 是你定义的结构体类型。

    例如:

    struct StkVec {
        std::string code;
        std::string name;
    };
    
    std::vector<StkVec> stkvecs1 = {
        {"301598", "黄山谷捷"}
    };
    

    这样,stkvecs1 就是一个结构体数组,可以使用 at() 方法访问每个结构体。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月17日