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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 41, средняя оценка - 4.95
Danvern
40 / 39 / 3
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
#1

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

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

Подскажите пожалуйста как закодировать например вот такую строку
привет
что бы она стала такой?
%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82
Википедии увидел такой алгоритм:
1)Переводим символ в Юникод.
2)затем разделяем каждый байт знаком процента
подскажите как сделать первый пункт?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.06.2011, 12:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перевод символа в Юникод (C++):

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

Перевод символа в число - C++
У меня такой вопрос. Необходимо прочитать из файла "input.txt" строку типа "D1", означающая координату на шахматной доске. Нужно первый...

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

Перевод символа в число и обратно. - C++
Здравствуйте! Как перевести число в символ, и ,наоборот, как перевести символ в число? То есть по ASCII 'A'==65, как можно это...

Перевод символа в верхний регистр - C++
код символа , который я ввожу в командой строке, отличается от кода символа в переменной rlow #include <iostream> #include...

Перевод символа в ASCII и запись в массив - C++
Добрый день! Задача: пользователь вводить строку символов, далее символы переводятся в ASCII в бинарном коде и записываются в массив...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
mimicria
return (true);
1958 / 1095 / 91
Регистрация: 19.04.2011
Сообщений: 2,345
24.06.2011, 12:23 #2
Цитата Сообщение от Danvern Посмотреть сообщение
подскажите как сделать первый пункт?
int MultiByteToWideChar(

UINT CodePage, // code page
DWORD dwFlags, // character-type options
LPCSTR lpMultiByteStr, // address of string to map
int cchMultiByte, // number of characters in string
LPWSTR lpWideCharStr, // address of wide-character buffer
int cchWideChar // size of buffer
);
1
oxotnik
1590 / 1067 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
24.06.2011, 12:29 #3
http://www.codeguru.com/cpp/cpp/cpp_...icle.php/c4029
0
xAtom
915 / 740 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
24.06.2011, 12:35 #4
Цитата Сообщение от mimicria Посмотреть сообщение
MultiByteToWideChar(
Только для Windows.

Вот консольное.

C++
1
2
3
4
5
6
    wchar_t   wstr[255];
    const char* str = "Ansi to Unicode";
 
    mbstowcs(wstr, str, strlen(str));  // конвертация
 
    wprintf(L"convert: %s", wstr);
1
Danvern
40 / 39 / 3
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
24.06.2011, 12:49  [ТС] #5
попробовал вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <stdio.h>
using namespace std;
 
int main()
{
        wchar_t   wstr[255];
        char str[2] = "п";
        mbstowcs(wstr, str, sizeof(str));  // конвертация
        wprintf(L"convert: %X\n", wstr);
        getchar();
}
выводит вот это 12fd7c
а по идее должно вывестись вот это D0BF
может быть я что не правильно сделал..
0
Danvern
40 / 39 / 3
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
25.06.2011, 14:41  [ТС] #6
реализовал вот так
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
#include <iostream>
#include <stdio.h>
using namespace std;
 
char * UrlEncode(char * c)
{
    const char lUrlDe[] = " \n\"#%+;<>@\\`ё№АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя";
 
    char * lUrlEn[] = {
                "%20","%0D","%22","%23","%25","%2B","%3B","%3C","%3E","%40","%5C","%60","%D1%91","%E2%84%96","%D0%90","%D0%91",
                "%D0%92","%D0%93","%D0%94","%D0%95","%D0%96","%D0%97","%D0%98","%D0%99","%D0%9A","%D0%9B","%D0%9C",
                "%D0%9D","%D0%9E","%D0%9F","%D0%A0","%D0%A1","%D0%A2","%D0%A3","%D0%A4","%D0%A5","%D0%A6","%D0%A7",
                "%D0%A8","%D0%A9","%D0%AA","%D0%AB","%D0%AC","%D0%AD","%D0%AE","%D0%AF","%D0%B0","%D0%B1","%D0%B2",
                "%D0%B3","%D0%B4","%D0%B5","%D0%B6","%D0%B7","%D0%B8","%D0%B9","%D0%BA","%D0%BB","%D0%BC","%D0%BD",
                "%D0%BE","%D0%BF","%D1%80","%D1%81","%D1%82","%D1%83","%D1%84","%D1%85","%D1%86","%D1%87","%D1%88",
                "%D1%89","%D1%8A","%D1%8B","%D1%8C","%D1%8D","%D1%8E","%D1%8F"
                                   };   
    int size = 128 * 128;
    char * p = new char[size];
    memset(p,0,sizeof(p));
    char temp[2];
    bool fin;
 
    for(int k = 0;k < (int)strlen(c);k++)
    {
        fin = true;
        for(int i = 0; i < sizeof(lUrlDe);i++)
        {
            if(c[k] == lUrlDe[i] && size > (int)strlen(p))
            {
                strcat(p,lUrlEn[i]);
                fin = false;
            }
        }
        if(fin)
        {
            if(size > (int)strlen(p))
            {
                memset(temp,0,2);
                temp[0] = c[k];
                strcat(p,temp);
            }
        }
    }
    return p;
}
 
int main()
{
    cout << UrlEncode("привет")  << endl;
    getchar();
    return 0;
}
0
oxotnik
1590 / 1067 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
25.06.2011, 21:40 #7
через ассоциативный массив типа std::map не легче было бы?
0
Danvern
40 / 39 / 3
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
27.06.2011, 08:15  [ТС] #8
не не легче... Просто я с ними не разу не работал...
0
schdub
2946 / 1291 / 238
Регистрация: 19.01.2009
Сообщений: 3,397
Завершенные тесты: 1
27.06.2011, 21:55 #9
Цитата Сообщение от Danvern Посмотреть сообщение
C++
1
2
char * p = new char[size];
memset(p,0,sizeof(p));
sizeof(указатель_на_массива) совсем не то же самое что sizeof(массив)

пример:
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
int main()
{
    const int size = 128 * 128;
    char buff[size];
    char * p = buff;
    std::cout << sizeof(p) << std::endl;
    std::cout << sizeof(buff) << std::endl;
    return 0;
}
1
schdub
2946 / 1291 / 238
Регистрация: 19.01.2009
Сообщений: 3,397
Завершенные тесты: 1
30.06.2011, 13:15 #10
Danvern, тут нужно отметить что использование данной функции накладывает на клиентский код необходимость в освобождении выделенной памяти когда она уже ненужна иначе при каждом вызове будет утечка памяти, причем весьма нехилая:
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>
using std::cout;
using std::endl;
 
// ... UrlEncode()
 
int main()
{
    // бажный код
    cout << UrlEncode("привет") << endl;
    cout << UrlEncode("привет") << endl;
    cout << UrlEncode("привет") << endl;
    cout << UrlEncode("привет") << endl;
    cout << UrlEncode("привет") << endl;
    // имеем утечку памяти (5 * 128 * 128) байт 
 
    // нужно чтобы клиент Вашей функции сам освобождал память:
    char * p = 0;
    
    p = UrlEncode("привет");
    cout << p << endl;
    delete[] p;
 
    p = UrlEncode("привет");
    cout << p << endl;
    delete[] p;
 
    p = UrlEncode("привет");
    cout << p << endl;
    delete[] p;
 
    p = UrlEncode("привет");
    cout << p << endl;
    delete[] p;
 
    p = UrlEncode("привет");
    cout << p << endl;
    delete[] p;
 
    return 0;
}
0
Danvern
40 / 39 / 3
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
05.07.2011, 18:59  [ТС] #11
вот ещё один вариант написал...
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
#include <iostream>
#include <stdio.h>
using namespace std;
 
int main()
{
    setlocale(0,"");
    char s[] = "hello";
    char temp[6];
    int hos,los ;
    long int sym;
    char * result = new char[strlen(s) * 6 + 1];
    wchar_t * sw = new wchar_t[strlen(s)];
    memset(result,0,strlen(s) * 6  + 1);
    memset(sw,0,strlen(s));
    mbstowcs(sw,s,strlen(s));
 
    for(int i = 0;i < strlen(s);i++)
    {
        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);
            result[strlen(result)] = '%';
            result[strlen(result)] = temp[0];
            result[strlen(result)] = temp[1];
            result[strlen(result)] = '%';
            result[strlen(result)] = temp[2];
            result[strlen(result)] = temp[3];
        }
    }
    cout << result << endl;
 
    delete[] sw;
    delete[] result;
 
    getchar();
    return 0;
}
подходит только для :
кириллица, расширенная латиница, арабский, армянский, греческий, еврейский и коптский алфавит; сирийское письмо, тана, нко; МФА; некоторые знаки препинания
для других символов смотреть сюда http://ru.wikipedia.org/wiki/UTF-8
0
schdub
2946 / 1291 / 238
Регистрация: 19.01.2009
Сообщений: 3,397
Завершенные тесты: 1
05.07.2011, 19:21 #12
1. strlen(s) - выполняется очень много раз, при том, что s не изменяется;
2. strlen(result) - зачем пробегаться по строке каждый раз 0 до последнего символа, вычисляя длину результирующей строки, если на каждой итерации цикла она изменяется либо на 6 символов, либо на 1;
3. Ужасно много магических чисел в коде.

Кстати, я ожидаю от алгоритма UrlEncode("hello world"), что он мне вернет строку "hello%20world", посмотрите, что у Вас возвращает. Так и задумано?
0
Danvern
40 / 39 / 3
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
05.07.2011, 19:26  [ТС] #13
1. strlen(s) - исправлю
2. strlen(result) - зачем пробегаться по строке каждый раз 0 до последнего символа, вычисляя длину результирующей строки, если на каждой итерации цикла она изменяется либо на 6 символов, либо на 1;
3. Ужасно много магических чисел в коде.
вы про это sym = ( ( ( ( ( 6 << 5 ) ^ hos ) << 2 ) ^ 2 ) << 6 ) ^ los;

Цитата Сообщение от schdub Посмотреть сообщение
Кстати, я ожидаю от алгоритма UrlEncode("hello world"), что он мне вернет строку "hello%20world", посмотрите, что у Вас возвращает. Так и задумано?
я же написал

Цитата Сообщение от Danvern Посмотреть сообщение
подходит только для :
кириллица, расширенная латиница, арабский, армянский, греческий, еврейский и коптский алфавит; сирийское письмо, тана, нко; МФА; некоторые знаки препинания
для других символов смотреть сюда http://ru.wikipedia.org/wiki/UTF-8
или просто добавить в цикл вот это
C++
1
2
3
4
5
6
7
8
9
10
        if((int)sw[i] <= 127)
        {
            memset(temp,0,sizeof(temp));
 
            sprintf(temp,"%X",(int)sw[i]);
 
            result[strlen(result)] = '%';
            result[strlen(result)] = temp[0];
            result[strlen(result)] = temp[1];
        }
например для проверки http://www.google.ru/search?client=o...hannel=suggest
0
schdub
2946 / 1291 / 238
Регистрация: 19.01.2009
Сообщений: 3,397
Завершенные тесты: 1
05.07.2011, 19:32 #14
Цитата Сообщение от Danvern Посмотреть сообщение
или просто добавить в цикл вот это
нет, если символ является ASCII, то его необходимо скопировать в результирующую строку без изменений:
нужно: "hello%20world"
по вашему алгоритму: "%68%65%6C%6C%6F%20%77%6F%72%6C%64"
1
Danvern
40 / 39 / 3
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
05.07.2011, 19:34  [ТС] #15
ну пока ещё не дошёл до этого а просто решил обезопасить сразу все символы
и гугл вроде это съедает))
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.07.2011, 19:34
Привет! Вот еще темы с ответами:

Юникод в Си++ - C++
Здравствуйте. int main(int argc, char *argv) { wstring s1 = L&quot;abracadabra&quot;; cout &lt;&lt; s1.size() &lt;&lt; endl; // 11 ...

Юникод. Шахматные символы - C++
Всем привет. Хочется написать консольные шахматы (цензура), но вот в чем загвоздка: как правильно ввести вот эти коды фигур в программный...

Юникод символ в консоли - C++
Здорова! Есть вопрос, от можно ли в консоли как то вывести юникод символы? Допустим есть код символа в юникод U+2660 и как мне его...

Юникод в двоичную систему - C++
Добрый день! Подскажите, как из файла прочитать знак (на русском языке), после чего напечатать на экране представление знака в двоичной...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
05.07.2011, 19:34
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru