Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
43 / 43 / 20
Регистрация: 08.12.2010
Сообщений: 342
1

Прилетают данные UTF-8, как правильно преобразовать в читабельный вид?

06.10.2015, 16:26. Показов 1233. Ответов 6
Метки нет (Все метки)

Как преобразовать вот это:
C++
1
cout << buf<<endl;
Выдает в UTF-8 кодировке:
C++
1
01%3Aasd+%D0%92%D0%B0%D1%81%D0%B8%D0%BB%D0%B8%D0%B9
Закодирована фраза: "01:asd Василий".
в читабельный вид?
Прилетает это все с POST запроса.
Пролазил ссылки по форуму:
из UTF-8 в Windows-1251
Преобразовать кодировку utf-8 в cp1251 и обратно
и т.д.
но что то не получается...
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.10.2015, 16:26
Ответы с готовыми решениями:

Как перевести строку в читабельный вид?
Собственно из названия темы. Есть строка символов (к примеру такая: 0430002004370430043904340438)...

Читабельный вид текстового файла
Пишу менеджер crontab. нужно что бы выводило все данные в нормальном, читабельном виде.. Например в...

преобразование кода в читабельный вид
получаю с нного ресурса данные в таком виде : на данный момент преобразовываю: function...

NixTime перевести в читабельный вид
Как перевести на JS nix время 1402833977 в такой вид день-месяц-год На PHP знаю. echo date...

6
15355 / 8303 / 2014
Регистрация: 30.01.2014
Сообщений: 14,176
06.10.2015, 23:25 2
Цитата Сообщение от Ника)) Посмотреть сообщение
но что то не получается...
Это не просто UTF-8.
Тебе надо сперва это все перевести в коды символов.
Т.е. отбросить процент, D0 перевести в число (например, strtol - она принимает последним параметром систему счисления, надо указать 16) и записать в char. Ну и т.д. А потом уже делать преобразование того, что получилось, в 1251 или еще куда...
0
Эксперт PHP
3042 / 2548 / 1198
Регистрация: 14.05.2014
Сообщений: 7,133
Записей в блоге: 1
06.10.2015, 23:33 3
Цитата Сообщение от DrOffset Посмотреть сообщение
и записать в char
не поместится в char, точнее поместится, но русские символы 2 байтами кодируются, лучше в whar_t
0
15355 / 8303 / 2014
Регистрация: 30.01.2014
Сообщений: 14,176
07.10.2015, 00:38 4
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
не поместится в char, точнее поместится, но русские символы 2 байтами кодируются
Правильно, первый байт, затем второй. UTF-8 хранят в char. 8 в названии не смущает?
Суррогатные пары, тройки, чертверки и т.д. UTF-8 подразумевает до 6 байт на символ в зависимости от языка.

Цитата Сообщение от Kerry_Jr Посмотреть сообщение
whar_t
Это UTF-16 или UTF-32 в зависимости от платформы. Не пойдет.

Добавлено через 10 минут
Kerry_Jr, собственно вот простейшая реализация. Как видишь, если консоль выводит char как UTF-8 (мы это можем наблюдать в любом Linux), то раскодирования, которое я предложил, достаточно для получения читаемого текста.
1
2626 / 2211 / 237
Регистрация: 03.07.2012
Сообщений: 7,990
Записей в блоге: 1
07.10.2015, 09:36 5
Цитата Сообщение от DrOffset Посмотреть сообщение
Суррогатные пары, тройки, чертверки
Нету в UTF-8 суррогатных пар - просто не нужны

Добавлено через 2 часа 18 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// utf8->char
unsigned char Hex2char(char *p) 
{   unsigned char c;
    if (*p>='a' && *p<='f')
        c=(*p-'a'+10)*16;
    else if (*p>='A' && *p<='F')
        c=(*p-'A'+10)*16;
    else // просто цифра
        c=(*p-'0')*16;
    // второй символ
    ++p;
    if (*p>='a' && *p<='f')
        c+=(*p-'a'+10);
    else if (*p>='A' && *p<='F')
        c+=(*p-'A'+10);
    else // просто цифра
        c+=(*p-'0');
    
    return c;
}
// преобразует строку типа "01%3Aasd+%D0%92%D0%B0" в win1251
char *decode(char *out, char *inp)
{   int c;
    while (*inp) {
        if (*inp=='%')  {
            c=Hex2char(++inp);
            if (c==0xD0 || c==0xD1) {
                // это был 1-й символ кириллицы, читаем 2-й символ
                inp += 2;
                c=(c<<6)&0x7FF;
                c+=Hex2char(++inp)&0x7F; // в c символ utf16
                // переводим в win1251
                if (c==0x401)
                    c=0xA8; // Ё
                else if (c==0x451)
                    c=0xB8; // ё
                else
                    c+=0xC0-0x410; // остальные буквы
            }
            *out++=c;
            inp+=2;
        }
        else *out++=*inp++;
    }
    *out=0;
    return inp; // можно вернуть что-то другое
}
0
7158 / 6133 / 2801
Регистрация: 14.04.2014
Сообщений: 26,455
07.10.2015, 11:16 6
А зачем 1251? Вот так надо:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <sstream>
#include <iomanip>
#include <string>
#include <locale>
#include <codecvt>
#include <cstdlib>
 
std::wstring URLDecode(std::string s)
{
    char c;
    std::string mbs, n;
    n.resize(2);
    std::istringstream iss(s);
 
    while (iss.get(c))
    {
        if (c == '%')
        {
            int i;
            iss >> n[0] >> n[1];
            std::istringstream issn(n);
            issn >> std::hex >> i;
            c = static_cast<char>(i);
        }
        else if (c == '+') c = ' ';
        mbs += c;
    }
 
    std::wstring_convert<std::codecvt_utf8<wchar_t>> cv;
    return cv.from_bytes(mbs);
}
 
int main()
{
    std::wcout.imbue(std::locale("rus_rus.866"));
    std::wcout << URLDecode("01%3Aasd+%D0%92%D0%B0%D1%81%D0%B8%D0%BB%D0%B8%D0%B9") << std::endl;
    
    system("pause");
    return 0;
}
1
2626 / 2211 / 237
Регистрация: 03.07.2012
Сообщений: 7,990
Записей в блоге: 1
07.10.2015, 11:30 7
Тоже хорошо. Зато мой код даже в простом Си работает
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.10.2015, 11:30

Вывод из MySQL в читабельный вид
Занимаюсь вынужденно php около месяца, не пинайте сильно. Встала задача - сделать форму для ввода...

Как правильно преобразовать данные textbox в datetime?
Здравствуйте. Имеется textbox в который заносится из базы или со вспомогательной формы дата в виде:...

Конвертация таблицы в MS EXCEL в читабельный вид
Добрый день всем. Помогите создать макрос на конвертацию таблицы в MS EXCEL в читабельный вид....

Перевести Hex код в читабельный вид
Есть задача перевести Hex код(код черновиковый) в читабельный вид. Есть 2 варианта преобразования...


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

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

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