Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/78: Рейтинг темы: голосов - 78, средняя оценка - 4.72
41 / 40 / 5
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
1

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

24.06.2011, 12:05. Показов 14482. Ответов 31
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Подскажите пожалуйста как закодировать например вот такую строку
привет
что бы она стала такой?
%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82
Википедии увидел такой алгоритм:
1)Переводим символ в Юникод.
2)затем разделяем каждый байт знаком процента
подскажите как сделать первый пункт?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.06.2011, 12:05
Ответы с готовыми решениями:

Вывод юникод символа в консоль
Здравствуйте. Подскажите пожалуйста как вывести юникод символ в консоль, например этот символ...

Какой код символа в кодировке Юникод отвечает за символ исключающее или ("⊕") ("XOR")
Нужно вывести данный символ в консоль , но я не могу найти какой у него код.

Получение символа по юникод-коду символа
Добрый день. Скажите, есть ли Win32 API функция для получения символа по юникод-коду символа?...

Перевод из Base64 в юникод
Здравствуйте. Мне нужно переводить строки из Base64 в юникод. Для этого использую метод: ...

31
41 / 40 / 5
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
06.07.2011, 06:28  [ТС] 21
Author24 — интернет-сервис помощи студентам
странно у меня 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;
}
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
06.07.2011, 09:26 22
Цитата Сообщение от Danvern Посмотреть сообщение
странно у меня wchat_t == 2
Чего странного-то?
0
41 / 40 / 5
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
06.07.2011, 10:15  [ТС] 23
ну если подумать то ни чего))
0
0 / 0 / 3
Регистрация: 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?
0
Эксперт функциональных языков программированияЭксперт Java
4486 / 2721 / 485
Регистрация: 28.04.2012
Сообщений: 8,590
19.03.2014, 11:36 25
Если речь про UTF-8, то вот так.
0
0 / 0 / 3
Регистрация: 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=-АФ-

Но хочется сделать по нормальному.
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
19.03.2014, 11:57 27
Цитата Сообщение от Torument Посмотреть сообщение
Надо из hex перевести в UTF-8.
UTF-8 это байт-ориентированная кодировка, поэтому если задача стоит именно как процитировано, то никаких пар символов распознавать не надо. Переводить надо именно побайтно. Другое дело, если вопрос стоит как декодированную последовательность байтов перевести из UTF-8 в какую-нибудь однобайтовую кодировку (типа cp1251), но это другая задача и здесь есть много разных средств. Я бы использовал libiconv, наверное. Кажется в WinAPI тоже что-то было.
0
0 / 0 / 3
Регистрация: 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-числу
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
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 в другую.
1
0 / 0 / 3
Регистрация: 13.03.2014
Сообщений: 16
19.03.2014, 12:23 30
Цитата Сообщение от grizlik78 Посмотреть сообщение
У меня linux и локаль UTF-8, поэтому всё выводится правильно. В Windows перед выводом надо перекодировать строку либо в cp1251, либо в cp866, в зависимости от того, куда производится вывод. Но это задача именно перекодировки из utf-8 в другую.
Если так, то это радует.
То есть перед самым выводом строку надо перевести из utf-8 или на этапе формирования строки?
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
19.03.2014, 12:27 31
Зависит от того, для чего эта строка нужна. Если только для вывода, то перед выводом. Если для чего-то ещё, то возможно стоит перекодировать её во внутреннее юникодное представление в виде wchar_t*. Надо посмотреть среди функций WinAPI, должна быть подходящая.

Добавлено через 1 минуту
MultiByteToWideChar
1
0 / 0 / 3
Регистрация: 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=Привет мир|

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

пока только в консоле для тестов работает, сейчас в прогу все функции вставлю: посмотрим будет ли работать.
0
19.03.2014, 17:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.03.2014, 17:09
Помогаю со студенческими работами здесь

Перевод символа в число
У меня такой вопрос. Необходимо прочитать из файла &quot;input.txt&quot; строку типа &quot;D1&quot;, означающая...

Перевод символа в число и обратно.
Здравствуйте! Как перевести число в символ, и ,наоборот, как перевести символ в число? То есть...

Перевод символа в верхний регистр
Формат входных данных Задан один символ c. Формат выходных данных Если символ является...

Перевод символа в нижний регистр
Привет всем)) у меня такой вопрос: почему функция tolower() возвращает не символ в нижнем регистре,...

Перевод символа в верхний регистр
код символа , который я ввожу в командой строке, отличается от кода символа в переменной rlow ...

Программа – «Перевод символа в числовой код
CLS N = ASC(“F”) PRINT “ Код буквы F: “; N Код буквы F: 70 Здесь всё нормально. ...


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

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