PostgreSQL C++ libpq кодирует проблему UTF-8

У меня нет проблем со вставкой UTF-8 (корейский символ в моем случае) с помощью прямой команды sql в консоли PGAdmin или psql. Но когда мне нужно вставить значения в C++ с помощью библиотеки libpq, я получил ошибку кодирования, и я не мог ее решить до сих пор.

Я протестировал соединение с БД и т. д. и работает хорошо. Поэтому я просто поделюсь только кодом вставки:

    /* 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

person gameon67    schedule 22.05.2020    source источник
comment
Ваш исходный код сохранен как utf-8? char литералы обычно кодируются в кодировке вашего исходного файла. Используйте литерал u8, чтобы гарантировать кодировку   -  person Alan Birtles    schedule 22.05.2020
comment
@AlanBirtles да, я проверил с помощью Notepad ++, и он был сохранен в UTF-8.   -  person gameon67    schedule 22.05.2020


Ответы (2)


Мне удалось это решить, извините за непонимание в обработке кодирования. Мне просто нужно преобразовать 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);
person gameon67    schedule 22.05.2020

Правильное решение — установить для параметра client_encoding правильное значение (кодировку, которую использует ваш клиент). Вы можете сделать это при подключении к базе данных:

PGconn *conn;

conn = PQconnectdb("user=carl password=secret client_encoding=LATIN1");
person Laurenz Albe    schedule 22.05.2020
comment
Я изменил на UTF8, но все равно получил то же сообщение об ошибке - person gameon67; 25.05.2020
comment
Правильно, вы не должны не переходить на UTF8 (если я не понимаю, что вы подразумеваете под изменением: изменить что?). client_encoding должен соответствовать кодировке данных, которые вы передаете клиенту. - person Laurenz Albe; 25.05.2020