简体   繁体   English

c ++ char数组unicode西里尔符号不正确

[英]c++ char array unicode cyrillic symbols incorrect

I have function in c++ that requests to java servlets. 我在C ++中具有向Java Servlet请求的功能。 It has parameter char* where function writes response. 它具有参数char *,函数在其中写入响应。 The symbols in this parameter are ok, except cyrillic ones. 该参数中的符号可以,除了西里尔字母。 Example: Рванов Рван (in fact, it has to be: Иванов Иван) 示例:РванРsРІРван(实际上,它必须是:ИвановИван)

But when I write this parameter to file, cyrillic symbols are OK as well. 但是,当我将此参数写入文件时,西里尔符号也可以。 Example code: 示例代码:

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

Here is code of my function 这是我的功能代码

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

Where: pszPostData - post request body servletUrl - path to servlet, excluding protocol, ip address and port resultBuffer have to be written by server response outputFile - log-file 其中:pszPostData-发布请求主体servletUrl-Servlet的路径,不包括协议,IP地址和端口resultBuffer必须由服务器响应写入outputFile-日志文件

When you POST text data to a webserver (actually, when you work with text data at all ) you need to be aware of what character encoding is in use. 当您将文本数据发布到Web服务器时(实际上,当您完全使用文本数据 ),您需要知道正在使用什么字符编码 Here, char *pszPostData just points to some bytes. 在这里, char *pszPostData仅指向一些字节。 We know they're text, but it could be encoded in ASCII. 我们知道它们是文本,但是可以将其编码为ASCII。 or UTF-8. 或UTF-8。 Or something entirely different. 或完全不同的东西。

On the web, the default character encoding for application/x-www-form-urlencoded is ISO-8859-1 , or "latin1", which cannot encode Cyrillic. 在网络上, application/x-www-form-urlencoded的默认字符编码为ISO-8859-1或“ latin1”,该字符无法编码西里尔字母。 (A character encoding maps bytes to characters; in latin1's case, it doesn't map any bytes to Cryllic characters, but it does map all the bytes to something , which means your data will get through, but won't decode to the right characters.) (字符编码将字节映射为字符;在latin1的情况下,它没有将任何字节映射为Cryllic字符,但确实将所有字节都映射为something ,这意味着您的数据将通过,但不会在右侧解码字符)。

That's the default. 这是默认值。 You can specify a specific encoding by saying: 您可以通过以下方式指定特定的编码:

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

You'll need to figure this out, however, as it's not clear to me what character set your data is actually in. (I'm not sure how "Иванов Иван" might get decoded as "Рванов Рван") 但是,您需要弄清楚这一点,因为我不清楚您的数据实际位于哪个字符集中。(我不确定“ИвановИван”如何可能被解码为“РванРsРІРван”)

The text in your example is encoded as UTF8 and viewed as CP1251. 示例中的文本被编码为UTF8,并被视为CP1251。

Please consider reading about Character encoding 请考虑阅读有关字符编码的信息

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM