Кодировка

smvrty

Новичок
Автор темы
29
4
Проблема такая: реализовал общение между клиентом и сервером через RPC.
Проблема в том, что клиент отправляет на сервер инфу в UTF8, а нужно принимать в cp1251.
Как грамотнее решить проблему с кодировками?
 

Вложения

  • chat.png
    chat.png
    71.3 KB · Просмотры: 74
Решение
Лучше избежать преобразования кодировок, если нету весомой причины для обратного. Лучше будет использовать одну и ту же кодировку и на сервере, и на клиенте.
Если все же требуется преобразовать кодировку, то можно воспользоваться библиотекой ICU, документацию к ней можно найти на их сайте.

Пример преобразования UTF-8 в 1251:
C++:
#include <string>
#include <vector>
#include <memory>
#include <cstdint>

#include <unicode/ucnv.h>
#include <unicode/unistr.h>

bool convertUtf8To1251(const std::string& input, std::string& output) {
    const std::string::size_type inputLength = input.size();
    std::vector<UChar> inputChars(inputLength);

    UErrorCode  status = U_ZERO_ERROR;
    UConverter* conv = ucnv_open("UTF-8", &status)...

#Rin

Известный
Всефорумный модератор
1,214
1,036
Лучше избежать преобразования кодировок, если нету весомой причины для обратного. Лучше будет использовать одну и ту же кодировку и на сервере, и на клиенте.
Если все же требуется преобразовать кодировку, то можно воспользоваться библиотекой ICU, документацию к ней можно найти на их сайте.

Пример преобразования UTF-8 в 1251:
C++:
#include <string>
#include <vector>
#include <memory>
#include <cstdint>

#include <unicode/ucnv.h>
#include <unicode/unistr.h>

bool convertUtf8To1251(const std::string& input, std::string& output) {
    const std::string::size_type inputLength = input.size();
    std::vector<UChar> inputChars(inputLength);

    UErrorCode  status = U_ZERO_ERROR;
    UConverter* conv = ucnv_open("UTF-8", &status);
    if (!U_SUCCESS(status)) {
        return false;
    }
    std::shared_ptr<UConverter> cnv(conv, ucnv_close);

    int32_t inputCharsLength = ucnv_toUChars(conv, inputChars.data(), inputLength, input.c_str(), inputLength, &status);
    if (!U_SUCCESS(status)) {
        return false;
    }

    UConverter* toconv = ucnv_open("windows-1251", &status);
    if (!U_SUCCESS(status)) {
        return false;
    }
    std::shared_ptr<UConverter> tocnv(toconv, ucnv_close);

    UChar const* source = inputChars.data();
    UChar const* sourceLimit = source + inputCharsLength;

    output.resize(inputCharsLength);

    char* target = output.data();
    char* targetLimit = target + inputCharsLength;

    ucnv_fromUnicode(toconv, &target, targetLimit, &source, sourceLimit, nullptr, true, &status);

    return U_SUCCESS(status);
}
 
  • Нравится
Реакции: smvrty

Похожие темы

  1. Ответы
    2K
    Просмотры
    1M
  2. Ответы
    49
    Просмотры
    155K
  3. Ответы
    357
    Просмотры
    211K