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

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

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

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

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

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

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

31
 Аватар для Danvern
41 / 40 / 5
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
06.07.2011, 06:28  [ТС]
Студворк — интернет-сервис помощи студентам
странно у меня 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
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
06.07.2011, 09:26
Цитата Сообщение от Danvern Посмотреть сообщение
странно у меня wchat_t == 2
Чего странного-то?
0
 Аватар для Danvern
41 / 40 / 5
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
06.07.2011, 10:15  [ТС]
ну если подумать то ни чего))
0
0 / 0 / 3
Регистрация: 13.03.2014
Сообщений: 16
19.03.2014, 10:40
А есть обратная функция (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
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,781
19.03.2014, 11:36
Если речь про UTF-8, то вот так.
0
0 / 0 / 3
Регистрация: 13.03.2014
Сообщений: 16
19.03.2014, 11:50
Надо из 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
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
19.03.2014, 11:57
Цитата Сообщение от Torument Посмотреть сообщение
Надо из hex перевести в UTF-8.
UTF-8 это байт-ориентированная кодировка, поэтому если задача стоит именно как процитировано, то никаких пар символов распознавать не надо. Переводить надо именно побайтно. Другое дело, если вопрос стоит как декодированную последовательность байтов перевести из UTF-8 в какую-нибудь однобайтовую кодировку (типа cp1251), но это другая задача и здесь есть много разных средств. Я бы использовал libiconv, наверное. Кажется в WinAPI тоже что-то было.
0
0 / 0 / 3
Регистрация: 13.03.2014
Сообщений: 16
19.03.2014, 12:09
задача собственно стоит в переводе из строки:
%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82%3D
в строку "Привет="

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

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

Добавлено через 5 минут
Код, который я приводил вместо П (%d0%9F) пишет Ð (это %d0) и Ÿ (это %9F), то есть П, вместо П. Так как по одному hex-числу
0
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
19.03.2014, 12:15
Это говорит от том, что код работает правильно.
Вот, тот же самый код, только законченный.
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;
}
Его вывод:
Code
1
2
3
$ ./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
Цитата Сообщение от grizlik78 Посмотреть сообщение
У меня linux и локаль UTF-8, поэтому всё выводится правильно. В Windows перед выводом надо перекодировать строку либо в cp1251, либо в cp866, в зависимости от того, куда производится вывод. Но это задача именно перекодировки из utf-8 в другую.
Если так, то это радует.
То есть перед самым выводом строку надо перевести из utf-8 или на этапе формирования строки?
0
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
19.03.2014, 12:27
Зависит от того, для чего эта строка нужна. Если только для вывода, то перед выводом. Если для чего-то ещё, то возможно стоит перекодировать её во внутреннее юникодное представление в виде wchar_t*. Надо посмотреть среди функций WinAPI, должна быть подходящая.

Добавлено через 1 минуту
MultiByteToWideChar
1
0 / 0 / 3
Регистрация: 13.03.2014
Сообщений: 16
19.03.2014, 17:09
Цитата Сообщение от 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.03.2014, 17:09

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

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

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

Перевод символа в верхний регистр
Формат входных данных Задан один символ c. Формат выходных данных Если символ является строчной буквой латинского алфавита (то...

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


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

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
сукцессия 9. Математика подлости: как растения предали грибных друзей
anaschu 27.06.2026
Статья 2. Глобальная фосфорная война: эволюционно-экономические механизмы распределения биомов Земли Введение: Экологический рынок как игра с нулевой суммой Традиционная экология долгое время. . .
сукцессия 8. Как я спорил с ИИ, которые - агенты растений и ненавистники грибов!
anaschu 27.06.2026
Статья 1. Хроники грибного восстания: как Сократов диалог разрушил академические догмы ИИ Введение: Синдром «цифрового учебника» Современные большие языковые модели (LLM) обладают колоссальным. . .
Главный вопрос моделирования сукцессии
anaschu 27.06.2026
главный вопрос. Если эктомикориза лучше добывает недоступный фосфор. И ее масса максимальна из всех. А широколиственный лес тоже имеет самую крутую биомассу. То почему не возникло их симбиоза? Это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru