c ++ char массив unicode кириллические символы неверны

У меня есть функция в C ++, которая запрашивает сервлеты Java. У него есть параметр char *, где функция записывает ответ. Символы в этом параметре в порядке, кроме кириллицы. Пример: РРІР ° РЅРѕРІ РРІР ° РЅ (на самом деле это должен быть: Иванов Иван)

Но когда я записываю этот параметр в файл, символы кириллицы тоже в порядке. Пример кода:

ofstream outputFile;
outputFile.open("log.txt");
printf("Respond from servlet: %s", parameter);

Вот код моей функции

int sendPostRequest(char *pszPostData, LPCTSTR servletUrl, char* resultBuffer, ofstream &outputFile) {

outputFile << "============== SENDING REEQUEST ====================" << endl;

HINTERNET hSession = WinHttpOpen(
userAgent,
WINHTTP_ACCESS_TYPE_NO_PROXY,
WINHTTP_NO_PROXY_NAME,
WINHTTP_NO_PROXY_BYPASS,
0);
if (!hSession)
{
_tprintf(_TEXT("Failed to open WinHTTP session: %ld\n"), GetLastError());
outputFile << "Failed to open WinHTTP session: %ld\n" << GetLastError() << endl;
return NULL;
}
else {
_tprintf(_TEXT("Oppening WinHTTP session successful: %ld\n"), GetLastError());
outputFile << "Oppening WinHTTP session successful: %ld\n" << GetLastError() << endl;
}

HINTERNET hConnect = WinHttpConnect(
hSession,
serverIP,
serverPort,
0);
if (!hConnect)
{
_tprintf(_TEXT("Failed to connect to server: %ld\n"), GetLastError());
outputFile << "Failed to connect to server: %ld\n" << GetLastError() << endl;
WinHttpCloseHandle(hSession);
return NULL;
}
else {
_tprintf(_TEXT("Connection to server successful: %ld\n"), GetLastError());
outputFile << "Connection to server successful: %ld\n" << GetLastError() << endl;
}

_tprintf(_TEXT("Post data : %ld\n"), pszPostData);
outputFile << "Post data : %ld\n" << pszPostData << endl;
DWORD dwDataLen = strlen(pszPostData);

HINTERNET hRequest = WinHttpOpenRequest(
hConnect,
_TEXT("POST"),
servletUrl,
NULL,
WINHTTP_NO_REFERER,
WINHTTP_DEFAULT_ACCEPT_TYPES,
WINHTTP_FLAG_REFRESH);
if (!hRequest)
{
_tprintf(_TEXT("Failed to open request: %ld\n"), GetLastError());
outputFile << "Failed to open request: %ld\n" << GetLastError() << endl;
WinHttpCloseHandle(hConnect);
WinHttpCloseHandle(hSession);
return -1;
}
else {
_tprintf(_TEXT("Opening request successful: %ld\n"), GetLastError());
outputFile << "Opening request successful: %ld\n" << GetLastError() << endl;
}

DWORD dwReqOpts = 0;
DWORD dwSize = sizeof(DWORD);
WinHttpSetOption(
hRequest,
WINHTTP_OPTION_SECURITY_FLAGS,
&dwReqOpts,
sizeof(DWORD));

BOOL done = false;
BOOL rc = WinHttpSendRequest(
hRequest,
contentTypeHeader,
-1,
(LPVOID)pszPostData,
dwDataLen,
dwDataLen,
NULL);

if (rc) {
rc = WinHttpReceiveResponse(hRequest, NULL);
_tprintf(_TEXT("Sending request successful: %ld\n"), GetLastError());
outputFile << "Sending request successful: %ld\n" << GetLastError() << endl;
}
else
{
_tprintf(_TEXT("Send request failed: %ld\n"), GetLastError());
outputFile << "Send request failed: %ld\n" << GetLastError() << endl;
WinHttpCloseHandle(hRequest);
WinHttpCloseHandle(hConnect);
WinHttpCloseHandle(hSession);
return -1;
}

// Get the status from the server
DWORD dwCode = 0;
if (rc)
{
rc = WinHttpQueryHeaders(
hRequest,
WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER,
NULL,
&dwCode,
&dwSize,
NULL);
}

if (dwCode != HTTP_STATUS_OK)
{
_tprintf(_TEXT("HTTP Request failed: %ld\n"), dwCode);
outputFile << "HTTP Request failed: %ld\n" << dwCode << endl;
WinHttpCloseHandle(hRequest);
WinHttpCloseHandle(hConnect);
WinHttpCloseHandle(hSession);
}
else
{
_tprintf(_TEXT("HTTP Request is ok: %ld\n"), dwCode);
outputFile << "HTTP Request is ok : %ld\n" << dwCode << endl;

// Keep reading from the remote server until there's nothing left to read
DWORD dwBytesToBeRead = 0, dwBytesRead = 0;
//char szBuffer[8192] = { 0 };
//strcpy(resultBuffer, "");
do
{
if (!WinHttpQueryDataAvailable(hRequest, &dwBytesToBeRead))
{
_tprintf(_TEXT("No data available from server? %ld"), GetLastError());
outputFile << "No data available from server? %ld" << GetLastError() << endl;

WinHttpCloseHandle(hRequest);
WinHttpCloseHandle(hConnect);
WinHttpCloseHandle(hSession);
return -1;
}

if (!WinHttpReadData(
hRequest,

//szBuffer,
resultBuffer,

//sizeof(szBuffer),
RESULT_BUFFER_SIZE,

&dwBytesRead))
{
_tprintf(_TEXT("Failed to read data from server: %ld"), GetLastError());
outputFile << "Failed to read data from server: %ld" << GetLastError() << endl;

WinHttpCloseHandle(hRequest);
WinHttpCloseHandle(hConnect);
WinHttpCloseHandle(hSession);
return -1;
}
if (dwBytesRead > 0)
{
//szBuffer[dwBytesRead] = 0;
resultBuffer[dwBytesRead] = 0; // NULL-terminated returned buffer
}
} while (dwBytesRead > 0);
WinHttpCloseHandle(hRequest);
WinHttpCloseHandle(hConnect);
WinHttpCloseHandle(hSession);
return 0;
}
return -1;
}

Куда:
pszPostData — тело запроса
servletUrl — путь к сервлету, исключая протокол, IP-адрес и порт
resultBuffer должен быть написан ответом сервера
outputFile — лог-файл

1

Решение

Когда вы размещаете текстовые данные на веб-сервере (на самом деле, когда вы работаете с текстовыми данными совсемВы должны знать, что кодировка символов используется Вот, char *pszPostData просто указывает на несколько байтов. Мы знаем, что это текст, но он может быть закодирован в ASCII. или UTF-8. Или что-то совершенно другое.

В сети кодировка символов по умолчанию для application/x-www-form-urlencoded является ISO-8859-1, или «latin1», который не может кодировать кириллицу. (Кодировка символов отображает байты на символы; в случае с latin1, она не отображает байты на символы Cryllic, но отображает все байты в что-то, Это означает, что ваши данные будут проходить, но не будут декодироваться до нужных символов.)

Это по умолчанию. Вы можете указать конкретную кодировку, сказав:

application/x-www-form-urlencoded; charset=<your data's character encoding>

Вы должны будете это выяснить, однако, так как мне не ясно, в каком наборе символов ваши данные на самом деле. (Я не уверен, как «Иванов Иван» может быть декодирован как «РРІР ° РЅРѕРІ РРІР ° РЅ»)

2

Другие решения

Текст в вашем примере кодируется как UTF8 и рассматривается как CP1251.

Пожалуйста, прочитайте о Кодировка символов

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector