MALOUDA-PSA 2025-03-17 18:47 采纳率: 85.6%
浏览 3

c++关于编码的问题


    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) {
    //    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");

    //        // 尝试转换并打印
    //        printf("stkcode: %s, stkname: %s\n", stkcode.c_str(), stkname.c_str());
    //    }
    //    mysql_free_result(res);
    //}

    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;
}


  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2025-03-17 18:47
    关注

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

    c++关于编码的问题

    你的问题是关于C++编码的问题,具体来说是关于std::vector的使用。

    从你的代码中可以看到,你定义了一个名为stkvecs1的std::vector,vector中的每个元素是一个stkvec类型的对象。然后,你尝试将一个字符串添加到vector中,但是代码中没有显示地将字符串转换为stkvec类型的对象。

    问题可能是,你需要将字符串转换为stkvec类型的对象,然后才能添加到vector中。可以使用std::pair或std::make_pair函数来实现这个转换。

    以下是一个简单的示例代码:

    #include <vector>
    #include <string>
    #include <utility>
    
    struct stkvec {
        std::string key;
        std::string value;
    };
    
    int main() {
        std::vector<std::pair<std::string, std::string>> stkvecs1 = {
            {"301598", "黄山谷捷"}
        };
    
        // ...
    }
    

    在上面的代码中,我们使用std::pair来定义stkvec结构体,然后使用std::vector来存储stkvec对象。这样,你就可以将字符串添加到vector中了。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月17日