PostgreSQL C++ libpq 编码 UTF-8 问题

4

我没有问题地在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

你的源代码保存为utf-8格式了吗? char 字符串通常编码与你的源文件相同。使用u8字面量可以保证正确的编码。 - Alan Birtles
@AlanBirtles 是的,我使用Notepad++进行了检查,它是以UTF-8格式保存的。 - gameon67
2个回答

1
我已经成功解决了它,抱歉我在编码处理方面的理解不足。我只需要将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);

1

正确的解决方案是将client_encoding参数设置为正确的值(您的客户端使用的编码)。连接到数据库时,您可以这样做:

PGconn *conn;

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

我改成了 UTF8 但仍然收到相同的错误信息。 - gameon67
正确,你不应该改变为UTF8(除非我误解了你所说的“改变”:改变什么?)。client_encoding必须与您向客户端提供的数据的编码匹配。 - Laurenz Albe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接