1 / 1 / 0
Регистрация: 20.04.2018
Сообщений: 58
1

Декодировать из юникода

18.10.2019, 19:50. Показов 2605. Ответов 9

Author24 — интернет-сервис помощи студентам
Люди добрые, помогите.
Есть строка например:
std::string = "\u00C0\u00E3\u00E5\u00ED\u00F2";
На сколько я понимаю она в cp-1251 в юникоде.
как ее преобразовать в кириллицу и записать в wstring, или в utf8 и оставить в string.
Компилятор v142, можно boost, QT, WinAPI, std, главное что бы заработало
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.10.2019, 19:50
Ответы с готовыми решениями:

Конвертация юникода
Здравствуйте, подскажите пожалуйста как юникод вида: \u041f\u043e\u043c\u043e\u0449\u0438:...

Обработка юникода
Получаю данные post через ajax, вот столкнулся с проблемой, если пользователь введет юникод, к...

Таблицы юникода
в процессе работы с шарпом возникла следующая проблема, надо создать список всех таблиц юникода по...

Вывод юникода в TStatusBar
Здравствуйте. Пытаюсь вывести юникод-символы в TStatusBar ('\lambda') - не отображается. В TEdit...

9
1 / 1 / 0
Регистрация: 20.04.2018
Сообщений: 58
18.10.2019, 19:52  [ТС] 2
судя по онлайн декодеру там записано слово "Агент"
Миниатюры
Декодировать из юникода  
0
фрилансер
5491 / 5089 / 1045
Регистрация: 11.10.2019
Сообщений: 13,313
18.10.2019, 21:00 3
я попробовал понять, что там:
std::wstring s= L"\u00C0\u00E3\u00E5\u00ED\u00F2";

в отладчике отобразилось так:
Àãåíò

онлайн раскодировщик определил, что
Агент
CP1252->CP1251

(по таблицам из википедии так оно и выходит)

То есть, по сути, в первоначальной строке нужно взять только младшие байты, и отобразить как CP1251
std::string s= "\xC0\xE3\xE5\xED\xF2";

Если я правильно понял
0
1 / 1 / 0
Регистрация: 20.04.2018
Сообщений: 58
18.10.2019, 21:24  [ТС] 4
и все же, как это сделать?)
честно, я плоховато разбираюсь в кодировках
0
фрилансер
5491 / 5089 / 1045
Регистрация: 11.10.2019
Сообщений: 13,313
18.10.2019, 21:46 5
Лучший ответ Сообщение было отмечено Mastering как решение

Решение

Mastering, вот так в юникод и utf8 получилось перегнать
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <QTextCodec>
...
...
    std::wstring ws= L"\u00C0\u00E3\u00E5\u00ED\u00F2";
 
    //тут тупо отрезаем старшие байты от wchar_t
    std::string text_cp1251(ws.begin(),ws.end());
 
    //конвертируем 1251 -> юникод
    QTextCodec* codec1251 = QTextCodec::codecForName("Windows-1251");
    QString unicode = codec1251->toUnicode(text_cp1251.c_str());
 
    //конвертируем  в utf8
    QByteArray utf8=unicode.toUtf8();
в utf8 и unicode - строка с кириллицей
1
1 / 1 / 0
Регистрация: 20.04.2018
Сообщений: 58
18.10.2019, 22:09  [ТС] 6
спасибо, рабочий код!
НО, что делать если такая строка все же приходит не в wstring, а в string?
0
фрилансер
5491 / 5089 / 1045
Регистрация: 11.10.2019
Сообщений: 13,313
18.10.2019, 22:12 7
Mastering, что значит "приходит в string" ? В std::string каждый элемент - char (длина один байт). В char не поместится wchar_t (точнее, отрежется старший байт)
0
1 / 1 / 0
Регистрация: 20.04.2018
Сообщений: 58
18.10.2019, 22:19  [ТС] 8
мне приходит json типа такого:
{
.....
"Params":
{
...
"name": "\u00C0\u00E3\u00E5\u00ED\u00F2 1",
"objname": "\u00C0\u00E3\u00E5\u00ED\u00F2 1",
.....
}
}
есть готовый парсер, который автоматом все парсит в string. Да, я понимаю что string это масив char. Вот как ни будь можно char впихнуть в wchar?)
0
фрилансер
5491 / 5089 / 1045
Регистрация: 11.10.2019
Сообщений: 13,313
18.10.2019, 22:41 9
Лучший ответ Сообщение было отмечено Mastering как решение

Решение

Mastering,

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    QTextCodec* codec1251 = QTextCodec::codecForName("Windows-1251");
    
    //имитация json
    const QByteArray json=R"(
    {
    "name": "\u00C0\u00E3\u00E5\u00ED\u00F2 1",
    "objname": "\u00C0\u00E3\u00E5\u00ED\u00F2 1"
    })";
    QJsonParseError error;
    const auto m=QJsonDocument::fromJson(json,&error).object().toVariantMap();
 
    auto parser=[&codec1251](const auto& var)
    {
        std::wstring ws=var.toString().toStdWString();
        std::string s(ws.begin(),ws.end());
        return codec1251->toUnicode(s.c_str());
    };
 
    QString name = parser(m["name"]);
    QString objname = parser(m["objname"]);
1
1 / 1 / 0
Регистрация: 20.04.2018
Сообщений: 58
18.10.2019, 22:57  [ТС] 10
Ух ты, работает, воспользуюсь QT'шным парсером
Спасибо!
0
18.10.2019, 22:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.10.2019, 22:57
Помогаю со студенческими работами здесь

Проблема с отображением юникода
Доброго времени суток. Познакомился с интересной вещью, как Unicode codepoint escape syntax....

Escape-последовательность Юникода
День добрый. Подскажите пожалуйста как мне создать строку в которой последовательность \x2f не...

Использование юникода в проекте?
В середине 2000-ых во время изучения любых новых языков практически всегда возникала проблема с...

Печать символами юникода
Вася любит в чате использовать смайлики, но поскольку в терминале встроенных смайликов нет, он...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru