Форум программистов, компьютерный форум CyberForum.ru

Перевод символа в Юникод - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 41, средняя оценка - 4.95
Danvern
 Аватар для Danvern
40 / 39 / 3
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
24.06.2011, 12:05     Перевод символа в Юникод #1
Подскажите пожалуйста как закодировать например вот такую строку
привет
что бы она стала такой?
%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82
Википедии увидел такой алгоритм:
1)Переводим символ в Юникод.
2)затем разделяем каждый байт знаком процента
подскажите как сделать первый пункт?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.06.2011, 12:05     Перевод символа в Юникод
Посмотрите здесь:

Перевод символа в нижний регистр C++
Юникод в Си++ C++
Перевод символа в число C++
C++ Юникод. Шахматные символы
Перевод символа в число и обратно. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Danvern
 Аватар для Danvern
40 / 39 / 3
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
06.07.2011, 06:28  [ТС]     Перевод символа в Юникод #21
странно у меня wchat_t == 2

Добавлено через 12 минут
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <iostream>
#include <stdio.h>
using namespace std;
 
int main()
{
    setlocale(0,"");
    system("cls");
 
    char s[] = "hello Word";
    char illegalChar[] = "0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz";
    const int illegalCharFor = sizeof(illegalChar);
    bool whatIllegal = false;
    char temp[6];
    int hos , los ,lenStr = strlen(s);
    long int sym;
    const int lenStrFor = lenStr;
    char * result = new char[lenStr * 6 + 1];
    wchar_t * sw = new wchar_t[lenStr + 1];
 
    memset(result,0,lenStr * 6  + 1);
    memset(sw,0,sizeof(wchar_t) * lenStr + 1);
 
    mbstowcs(sw,s,lenStr);
 
    for(int i = 0;i < lenStrFor;i++)
    {
        
        if((int)sw[i] <= 127)
        {
            memset(temp,0,sizeof(temp));
            for(int k = 0;k < illegalCharFor;k++)
            {
                if(illegalChar[k] == sw[i])
                {
                    whatIllegal = true;
                    break;
                }
            }
 
            lenStr = strlen(result);
 
            if(!whatIllegal)
            {
                sprintf(temp,"%X",(int)sw[i]);
                result[lenStr] = '%';
                result[lenStr + 1] = temp[0];
                result[lenStr + 2] = temp[1];
            }
            else
            {
                result[lenStr] = sw[i];
                whatIllegal = false;
            }
        }
 
        if((int)sw[i] >= 128 && (int)sw[i] <= 2047)
        {
            hos = sw[i] >> 6;
            los = (hos << 6) ^ sw[i];
            sym = ( ( ( ( ( 6 << 5 ) ^ hos ) << 2 ) ^ 2 ) << 6 ) ^ los;
 
            memset(temp,0,sizeof(temp));
 
            sprintf(temp,"%X",sym);
 
            lenStr = strlen(result);
            result[lenStr] = '%';
            result[lenStr + 1] = temp[0];
            result[lenStr + 2] = temp[1];
            result[lenStr + 3] = '%';
            result[lenStr + 4] = temp[2];
            result[lenStr + 5] = temp[3];
        }
    }
 
    cout << result << endl;
 
    delete[] sw;
    delete[] result;
 
    getchar();
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
06.07.2011, 09:26     Перевод символа в Юникод #22
Цитата Сообщение от Danvern Посмотреть сообщение
странно у меня wchat_t == 2
Чего странного-то?
Danvern
 Аватар для Danvern
40 / 39 / 3
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
06.07.2011, 10:15  [ТС]     Перевод символа в Юникод #23
ну если подумать то ни чего))
Torument
0 / 0 / 1
Регистрация: 13.03.2014
Сообщений: 16
19.03.2014, 10:40     Перевод символа в Юникод #24
А есть обратная функция (UrlDecode), для работы с кириллицей?

Добавлено через 9 часов 54 минуты
есть вот такой код:
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
inline int ishex(int x)
{
    return  (x >= '0' && x <= '9')  ||
        (x >= 'a' && x <= 'f')  ||
        (x >= 'A' && x <= 'F');
}
 
int decodeUrl(const char *s, char *dec)
{
    char *o;
    const char *end = s + strlen(s);
    int c;
 
    for (o = dec; s <= end; o++) {
        c = *s++;
        if (c == '+') c = ' ';
        else if (c == '%' && (  !ishex(*s++)    ||
                    !ishex(*s++)    ||
                    !sscanf(s - 2, "%2x", &c)))
            return -1;
 
        if (dec) *o = c;
    }
 
    return o - dec;
}
С кириллицей он не работает, так как обрататывает по 2 hex символа. А кириллица кодируется 4-мя знаками (если не считать %).
Как грамотно переделать код чтобы он различал где брать 2 пары символов для одной буквы, а где пару например пробел - %20 или знак равно - %3D?
korvin_
 Аватар для korvin_
1325 / 1096 / 160
Регистрация: 28.04.2012
Сообщений: 3,923
19.03.2014, 11:36     Перевод символа в Юникод #25
Если речь про UTF-8, то вот так.
Torument
0 / 0 / 1
Регистрация: 13.03.2014
Сообщений: 16
19.03.2014, 11:50     Перевод символа в Юникод #26
Надо из hex перевести в UTF-8. Основная задача распознать в каком случае брать одну пару символов, а когда 2 пары (русские буквы)

есть таблица http://web-developer.name/urlcode/ где есть все символы

я бы, конечно мог сделать что-то в роде (не с++):
C#
1
2
3
string s= "-%d0%90%d0%a4-"
s = s.replace("%d0%90", "А");
s = s.replace("%d0%90", "Ф");
и получить s=-АФ-

Но хочется сделать по нормальному.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
19.03.2014, 11:57     Перевод символа в Юникод #27
Цитата Сообщение от Torument Посмотреть сообщение
Надо из hex перевести в UTF-8.
UTF-8 это байт-ориентированная кодировка, поэтому если задача стоит именно как процитировано, то никаких пар символов распознавать не надо. Переводить надо именно побайтно. Другое дело, если вопрос стоит как декодированную последовательность байтов перевести из UTF-8 в какую-нибудь однобайтовую кодировку (типа cp1251), но это другая задача и здесь есть много разных средств. Я бы использовал libiconv, наверное. Кажется в WinAPI тоже что-то было.
Torument
0 / 0 / 1
Регистрация: 13.03.2014
Сообщений: 16
19.03.2014, 12:09     Перевод символа в Юникод #28
задача собственно стоит в переводе из строки:
%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82%3D
в строку "Привет="

Тут каждый кириллический (далее буду писать русский) символ состоит из пары шестнадцатиричных чисел, а = состоит из 1го шестнадцатиричного числа (hex) %3D.

Как брать не по парам, я не понимаю.

Добавлено через 5 минут
Код, который я приводил вместо П (%d0%9F) пишет Ð (это %d0) и Ÿ (это %9F), то есть П, вместо П. Так как по одному hex-числу
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
19.03.2014, 12:15     Перевод символа в Юникод #29
Это говорит от том, что код работает правильно.
Вот, тот же самый код, только законченный.
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
#include <iostream>
#include <cstdio>
#include <cstring>
 
inline int ishex(int x)
{
    return  (x >= '0' && x <= '9')  ||
        (x >= 'a' && x <= 'f')  ||
        (x >= 'A' && x <= 'F');
}
 
int decodeUrl(const char *s, char *dec)
{
    char *o;
    const char *end = s + strlen(s);
    int c;
 
    for (o = dec; s <= end; o++) {
        c = *s++;
        if (c == '+') c = ' ';
        else if (c == '%' && (  !ishex(*s++)    ||
                    !ishex(*s++)    ||
                    !sscanf(s - 2, "%2x", &c)))
            return -1;
 
        if (dec) *o = c;
    }
 
    return o - dec;
}
 
int main()
{
    char const *str = "%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82%3D";
    char dec_str[256];
    decodeUrl(str, dec_str);
    std::cout << str << std::endl;
    std::cout << dec_str << std::endl;
}
Его вывод:
Код
$ ./hello 
%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82%3D
Привет=
У меня linux и локаль UTF-8, поэтому всё выводится правильно. В Windows перед выводом надо перекодировать строку либо в cp1251, либо в cp866, в зависимости от того, куда производится вывод. Но это задача именно перекодировки из utf-8 в другую.
Torument
0 / 0 / 1
Регистрация: 13.03.2014
Сообщений: 16
19.03.2014, 12:23     Перевод символа в Юникод #30
Цитата Сообщение от grizlik78 Посмотреть сообщение
У меня linux и локаль UTF-8, поэтому всё выводится правильно. В Windows перед выводом надо перекодировать строку либо в cp1251, либо в cp866, в зависимости от того, куда производится вывод. Но это задача именно перекодировки из utf-8 в другую.
Если так, то это радует.
То есть перед самым выводом строку надо перевести из utf-8 или на этапе формирования строки?
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
19.03.2014, 12:27     Перевод символа в Юникод #31
Зависит от того, для чего эта строка нужна. Если только для вывода, то перед выводом. Если для чего-то ещё, то возможно стоит перекодировать её во внутреннее юникодное представление в виде wchar_t*. Надо посмотреть среди функций WinAPI, должна быть подходящая.

Добавлено через 1 минуту
MultiByteToWideChar
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.03.2014, 17:09     Перевод символа в Юникод
Еще ссылки по теме:

Юникод символ в консоли C++
Вывод юникод символа в консоль C++
Юникод в двоичную систему C++

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

Или воспользуйтесь поиском по форуму:
Torument
0 / 0 / 1
Регистрация: 13.03.2014
Сообщений: 16
19.03.2014, 17:09     Перевод символа в Юникод #32
Цитата Сообщение от grizlik78 Посмотреть сообщение
Зависит от того, для чего эта строка нужна. Если только для вывода, то перед выводом. Если для чего-то ещё, то возможно стоит перекодировать её во внутреннее юникодное представление в виде wchar_t*. Надо посмотреть среди функций WinAPI, должна быть подходящая.
Добавлено через 1 минуту
MultiByteToWideChar
Моя прога получает данные извне (Удаленный сервер шлет), проверяет данные и отсылает в локальную БД.
То есть мне надо получить, перекодировать, потом отправить данные. Среда MS Visual C++ 6.0.

Попробую MultiByteToWideChar

Добавлено через 3 часа 21 минуту
Результаты:
закодированная строка:
Message%3D%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82%20%D0%BC%D0%B8%D1%80%7C

раскодированная строка:
Message=╨Я╤А╨╕╨▓╨╡╤В ╨╝╨╕╤А|

переведена из UTF-8 в сp1251:
Message=╧ЁштхЄ ьшЁ|

подшаманина для вывода в консоль:
Message=Привет мир|

угадайте какая была исхододная

пока только в консоле для тестов работает, сейчас в прогу все функции вставлю: посмотрим будет ли работать.
Yandex
Объявления
19.03.2014, 17:09     Перевод символа в Юникод
Ответ Создать тему
Опции темы

Текущее время: 00:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru