簡體   English   中英

PostgreSQL C++ libpq編碼UTF-8問題

[英]PostgreSQL C++ libpq encoding UTF-8 problem

我在 PGAdmin 或 psql 控制台中使用直接 sql 命令插入 UTF-8 (在我的情況下為韓語字符)沒有問題。 但是當我需要使用 libpq 庫在 C++ 中插入值時,我得到了編碼錯誤,直到現在我才能解決它。

我已經測試了數據庫連接等並且運行良好。 所以我只會分享插入代碼:

    /* INSERT demo */
    res = PQexec(conn,
        "insert into db_test values('testval', '군포지사','N00225','영동선','0500','E',13.67,14.18);");
    if (PQresultStatus(res) != PGRES_COMMAND_OK) {
        std::cout << "Insert into table failed: " << PQresultErrorMessage(res)
            << std::endl;
    }
    else
        std::cout << "inserted" << std::endl;
    PQclear(res);

以下是錯誤:

Insert into table failed: ERROR:  invalid byte sequence for encoding "UTF8": 0xb1

我已經設法解決了,抱歉我對編碼處理缺乏了解。 我只需要將 ANSI 轉換為 UTF-8,下面是我的工作代碼。 如果有更好的解決方案,請發布您的答案。

int AnsiToUTF8(char* szSrc, char* strDest, int destSize)
{
    WCHAR szUnicode[255];
    char szUTF8code[255];
    int nUnicodeSize = MultiByteToWideChar(CP_ACP, 0, szSrc, (int)strlen(szSrc), szUnicode, sizeof(szUnicode));
    int nUTF8codeSize = WideCharToMultiByte(CP_UTF8, 0, szUnicode, nUnicodeSize, szUTF8code, sizeof(szUTF8code), NULL, NULL);
    assert(destSize > nUTF8codeSize);
    memcpy(strDest, szUTF8code, nUTF8codeSize);
    strDest[nUTF8codeSize] = 0;
    return nUTF8codeSize;
}

/* INSERT demo */
    char queryUtf8[100];
    std::string queryAnsi = "insert into db_test values('testval', '군포지사','N00225','영동선','0500','E',13.67,14.18);";
    AnsiToUTF8(&queryAnsi[0u], queryUtf8, 100);

    res = PQexec(conn, queryUtf8);
    if (PQresultStatus(res) != PGRES_COMMAND_OK) {
        std::cout << "Insert into table failed: " << PQresultErrorMessage(res)
            << std::endl;
    }
    else
        std::cout << "inserted" << std::endl;
    PQclear(res);

正確的解決方案是將client_encoding參數設置為正確的值(您的客戶端使用的編碼)。 您可以在連接到數據庫時執行此操作:

PGconn *conn;

conn = PQconnectdb("user=carl password=secret client_encoding=LATIN1");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM