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