Перевести текст из UTF8 в CP1251

vegas

Известный
Автор темы
546
426
Я получаю сообщения из телеграмм чата с ботом, и как бы все хорошо но пока не начну отправлять русские символы ибо они превращаются вот в это "\u041f\u0440\u0438\u0432\u0435\u0442"(Это слово "Привет"). Как мне перевести этот текст как я понял из формата UTF8 в CP1251? Много каких-то функций с разных форумов попробовал но не одна не помогла :P
 
Решение
Причем тут это, проблема в том что при входе Английской буквы в твою функцию cp_to_utf8 игра крашит
Сказал бы сразу

C++:
#include <string>
#include <vector>
#include <regex>
#include <charconv>

std::vector<std::string> split(const std::string& str, const std::string& delim) {
    std::vector<std::string> strings;
    size_t start;
    size_t end = 0;
    while ((start = str.find_first_not_of(delim, end)) != std::string::npos) {
        end = str.find(delim, start);
        strings.push_back(str.substr(start, end - start));
    }
    return strings;
}

std::uint32_t utf8_encode(char* out, uint32_t utf)
{
    if (utf <= 0x7F) {
        // Plain ASCII
        out[0] = (char)utf;
        out[1] = 0;
        return 1;
    }
    else...

Dark_Knight

Me, me and me.
Друг
4,062
2,077
Куда вводится?
Куда куда. В инпат. В Wndproc imgui на WM_CHAR у тебя как стоит? Вот тут уже с костылем, но полностью рабочим.
1646501763554.png
 

Dark_Knight

Me, me and me.
Друг
4,062
2,077
эм... а это тут причём?
У меня в сборке на многобайтовой кодировке работает так. По факту, вообще надо посмотреть откуда он инфу берёт, а то вообще может быть проблема не в этом.
 

zTechnology

Известный
1,101
485
У меня в сборке на многобайтовой кодировке работает так. По факту, вообще надо посмотреть откуда он инфу берёт, а то вообще может быть проблема не в этом.
Эм.... Ну так причём тут WindProc к получению кодировки с телеги, когда телега русский текст через апи выводит так:
1646508205356.png

Либо ты не понял суть вопроса, в котором нуждался автор темы, либо я тебя сейчас не понимаю
 

Dark_Knight

Me, me and me.
Друг
4,062
2,077
Эм.... Ну так причём тут WindProc к получению кодировки с телеги, когда телега русский текст через апи выводит так:
Посмотреть вложение 138753
Либо ты не понял суть вопроса, в котором нуждался автор темы, либо я тебя сейчас не понимаю
У меня уже имгуи головного мозга 🤣🤣
 
  • Нравится
Реакции: zTechnology

kin4stat

mq-team
Всефорумный модератор
2,730
4,710
*** Скрытый текст не может быть процитирован. ***
Ну ты и насрал конечно говна что пиздец

Ради простейшей задачи которая решается двумя функциями спасченных с интернета, подключать хост. Еще и на хосте хуйни наделал. А если мне смайлик отправят в телеге? Или украинскую i?
Еще и под хайд убрал
C++:
#include <string>
#include <vector>

std::vector<std::string> split(const std::string& str, const std::string& delim) {
    std::vector<std::string> strings;
    size_t start;
    size_t end = 0;
    while ((start = str.find_first_not_of(delim, end)) != std::string::npos) {
        end = str.find(delim, start);
        strings.push_back(str.substr(start, end - start));
    }
    return strings;
}

std::uint32_t utf8_encode(char *out, uint32_t utf)
{
  if (utf <= 0x7F) {
    // Plain ASCII
    out[0] = (char) utf;
    out[1] = 0;
    return 1;
  }
  else if (utf <= 0x07FF) {
    // 2-byte unicode
    out[0] = (char) (((utf >> 6) & 0x1F) | 0xC0);
    out[1] = (char) (((utf >> 0) & 0x3F) | 0x80);
    out[2] = 0;
    return 2;
  }
  else if (utf <= 0xFFFF) {
    // 3-byte unicode
    out[0] = (char) (((utf >> 12) & 0x0F) | 0xE0);
    out[1] = (char) (((utf >>  6) & 0x3F) | 0x80);
    out[2] = (char) (((utf >>  0) & 0x3F) | 0x80);
    out[3] = 0;
    return 3;
  }
  else if (utf <= 0x10FFFF) {
    // 4-byte unicode
    out[0] = (char) (((utf >> 18) & 0x07) | 0xF0);
    out[1] = (char) (((utf >> 12) & 0x3F) | 0x80);
    out[2] = (char) (((utf >>  6) & 0x3F) | 0x80);
    out[3] = (char) (((utf >>  0) & 0x3F) | 0x80);
    out[4] = 0;
    return 4;
  }
  else {
    // error - use replacement character
    out[0] = (char) 0xEF;
    out[1] = (char) 0xBF;
    out[2] = (char) 0xBD;
    out[3] = 0;
    return 0;
  }
}

std::string cp_to_utf8(const std::string& input) {
    std::string out;
 
    auto points = split(input, R"(\u)");
    for (auto& p : points) {
        char buf[8];
        auto len = utf8_encode(buf, std::stoi(p, nullptr, 16));
        out.append(std::string{buf, len});
    }
 
    return out;
}
usage:
C++:
int main() {
 
    setlocale(LC_ALL, "en_US.utf8");

    std::string input = R"(\u041f\u0440\u0438\u0432\u0435\u0442)";

    std::cout << cp_to_utf8(input) << std::endl;
}
 
  • Нравится
Реакции: legendabrn и zTechnology

x0r1x

Потрачен
114
97
Ну ты и насрал конечно говна что пиздец

Ради простейшей задачи которая решается двумя функциями спасченных с интернета, подключать хост. Еще и на хосте хуйни наделал. А если мне смайлик отправят в телеге? Или украинскую i?
Еще и под хайд убрал
C++:
#include <string>
#include <vector>

std::vector<std::string> split(const std::string& str, const std::string& delim) {
    std::vector<std::string> strings;
    size_t start;
    size_t end = 0;
    while ((start = str.find_first_not_of(delim, end)) != std::string::npos) {
        end = str.find(delim, start);
        strings.push_back(str.substr(start, end - start));
    }
    return strings;
}

std::uint32_t utf8_encode(char *out, uint32_t utf)
{
  if (utf <= 0x7F) {
    // Plain ASCII
    out[0] = (char) utf;
    out[1] = 0;
    return 1;
  }
  else if (utf <= 0x07FF) {
    // 2-byte unicode
    out[0] = (char) (((utf >> 6) & 0x1F) | 0xC0);
    out[1] = (char) (((utf >> 0) & 0x3F) | 0x80);
    out[2] = 0;
    return 2;
  }
  else if (utf <= 0xFFFF) {
    // 3-byte unicode
    out[0] = (char) (((utf >> 12) & 0x0F) | 0xE0);
    out[1] = (char) (((utf >>  6) & 0x3F) | 0x80);
    out[2] = (char) (((utf >>  0) & 0x3F) | 0x80);
    out[3] = 0;
    return 3;
  }
  else if (utf <= 0x10FFFF) {
    // 4-byte unicode
    out[0] = (char) (((utf >> 18) & 0x07) | 0xF0);
    out[1] = (char) (((utf >> 12) & 0x3F) | 0x80);
    out[2] = (char) (((utf >>  6) & 0x3F) | 0x80);
    out[3] = (char) (((utf >>  0) & 0x3F) | 0x80);
    out[4] = 0;
    return 4;
  }
  else {
    // error - use replacement character
    out[0] = (char) 0xEF;
    out[1] = (char) 0xBF;
    out[2] = (char) 0xBD;
    out[3] = 0;
    return 0;
  }
}

std::string cp_to_utf8(const std::string& input) {
    std::string out;
 
    auto points = split(input, R"(\u)");
    for (auto& p : points) {
        char buf[8];
        auto len = utf8_encode(buf, std::stoi(p, nullptr, 16));
        out.append(std::string{buf, len});
    }
 
    return out;
}
usage:
C++:
int main() {
 
    setlocale(LC_ALL, "en_US.utf8");

    std::string input = R"(\u041f\u0440\u0438\u0432\u0435\u0442)";

    std::cout << cp_to_utf8(input) << std::endl;
}
про директивы вы забыли? или стал даркпикселем?
 
  • Bug
Реакции: zTechnology и kin4stat

vegas

Известный
Автор темы
546
426
Ну ты и насрал конечно говна что пиздец

Ради простейшей задачи которая решается двумя функциями спасченных с интернета, подключать хост. Еще и на хосте хуйни наделал. А если мне смайлик отправят в телеге? Или украинскую i?
Еще и под хайд убрал
C++:
#include <string>
#include <vector>

std::vector<std::string> split(const std::string& str, const std::string& delim) {
    std::vector<std::string> strings;
    size_t start;
    size_t end = 0;
    while ((start = str.find_first_not_of(delim, end)) != std::string::npos) {
        end = str.find(delim, start);
        strings.push_back(str.substr(start, end - start));
    }
    return strings;
}

std::uint32_t utf8_encode(char *out, uint32_t utf)
{
  if (utf <= 0x7F) {
    // Plain ASCII
    out[0] = (char) utf;
    out[1] = 0;
    return 1;
  }
  else if (utf <= 0x07FF) {
    // 2-byte unicode
    out[0] = (char) (((utf >> 6) & 0x1F) | 0xC0);
    out[1] = (char) (((utf >> 0) & 0x3F) | 0x80);
    out[2] = 0;
    return 2;
  }
  else if (utf <= 0xFFFF) {
    // 3-byte unicode
    out[0] = (char) (((utf >> 12) & 0x0F) | 0xE0);
    out[1] = (char) (((utf >>  6) & 0x3F) | 0x80);
    out[2] = (char) (((utf >>  0) & 0x3F) | 0x80);
    out[3] = 0;
    return 3;
  }
  else if (utf <= 0x10FFFF) {
    // 4-byte unicode
    out[0] = (char) (((utf >> 18) & 0x07) | 0xF0);
    out[1] = (char) (((utf >> 12) & 0x3F) | 0x80);
    out[2] = (char) (((utf >>  6) & 0x3F) | 0x80);
    out[3] = (char) (((utf >>  0) & 0x3F) | 0x80);
    out[4] = 0;
    return 4;
  }
  else {
    // error - use replacement character
    out[0] = (char) 0xEF;
    out[1] = (char) 0xBF;
    out[2] = (char) 0xBD;
    out[3] = 0;
    return 0;
  }
}

std::string cp_to_utf8(const std::string& input) {
    std::string out;
 
    auto points = split(input, R"(\u)");
    for (auto& p : points) {
        char buf[8];
        auto len = utf8_encode(buf, std::stoi(p, nullptr, 16));
        out.append(std::string{buf, len});
    }
 
    return out;
}
usage:
C++:
int main() {
 
    setlocale(LC_ALL, "en_US.utf8");

    std::string input = R"(\u041f\u0440\u0438\u0432\u0435\u0442)";

    std::cout << cp_to_utf8(input) << std::endl;
}
1646518610782.png


А если без этого использовать то при наличии в строке любых символов кроме русских игра вылетает
 

kin4stat

mq-team
Всефорумный модератор
2,730
4,710