Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как узнать код символа в Unicode?


Автор: gif0 4.2.2010, 02:01
Как узнать код символа в Unicode?

Автор: jonie 4.2.2010, 02:15
в каком конкретно Unicode ? (какая кодирвока юникод вас интеерсует) ?

Автор: gif0 4.2.2010, 03:09
jonie, я не знаю. Если вы имеете в виду, какой язык мне нужен, то это китайский (это не шутка). Но вы, очевидно, имели в виду другое.

Дело в том, что я хочу написать простую программу, которая будет шифровать текст (русский или английский) таким образом, что бы каждый символ отображался иероглифом. Соответственно, мне нужно знать код символа, что бы "передвинуть" этот символ настолько, что бы он "достал" до китайского алфавита.  И еще нужно узнать, в каком диапазоне чисел находится китайский алфавит.

Кстати, я правильно понимаю, что тип char не поддерживает Unicode?

Автор: jonie 4.2.2010, 12:40
Цитата

Кстати, я правильно понимаю, что тип char не поддерживает Unicode? 
неправильно в общем случае.
Кодировок Unicode дофига и больше, есть например UCS-2, UTF-8, UTF-32.
Определитесь какая вам нужна для начала. Почитайте про юникод в какой-нибудь википедии или в первоисточнике unicode.org ....

Автор: xvr 4.2.2010, 12:45
Цитата(gif0 @ 4.2.2010,  02:01)
Как узнать код символа в Unicode?

http://www.unicode.org/charts/
Конкретно: http://www.unicode.org/charts/PDF/U4E00.pdf
(от 4E00 по 9FCB, всего 610 страниц иероглифов)


Автор: gif0 6.2.2010, 03:27
Цитата(jonie @ 4.2.2010,  12:40)
Цитата

Кстати, я правильно понимаю, что тип char не поддерживает Unicode? 
неправильно в общем случае.

Почему? Я думал, что char может содержать значения только из ASCII.

Автор: gif0 6.2.2010, 04:24
Как число преобразовать в Unicode символ? Т.е. как число 22554 преобразовать в иероглиф? Использую C++ Builder 2010.

Автор: mes 6.2.2010, 05:28
Цитата(gif0 @  6.2.2010,  02:27 Найти цитируемый пост)
Я думал, что char может содержать значения только из ASCII. 

От кодировки в принципе зависит только  вывод в символьном виде (ну и некоторые другие специфические операции, например замена заглавных букв прописными). Char же хранит код символа и ему плевать на кодировку.. Но следует учитывать, что поместиться туда (в char) могут только однобайтовые коды.

Автор: jonie 6.2.2010, 10:30
Цитата(gif0 @ 6.2.2010,  03:27)
Цитата(jonie @ 4.2.2010,  12:40)
Цитата

Кстати, я правильно понимаю, что тип char не поддерживает Unicode? 
неправильно в общем случае.

Почему? Я думал, что char может содержать значения только из ASCII.

тебе наврали. Вот например char z='Z'; - чем не символ в UTF-8 ?
Если вы нам так и не раскажите о той кодировке которая вам нужна, то мы вам не поможем ни с каким преобразованием. Учите матчасть, перед тем как задавать вопросы...

Автор: xvr 6.2.2010, 11:23
Цитата(gif0 @ 6.2.2010,  04:24)
Как число преобразовать в Unicode символ? Т.е. как число 22554 преобразовать в иероглиф? 

Код

wchar_t symbol=22554;

Цитата

Использую C++ Builder 2010.

Код

wchar_t my_string[]={22554,0);
AnsiString s(my_string);


Автор: gif0 7.2.2010, 06:32
Программу я написал, но возникла проблема. После того как я зашифровал, а потом дешифровал текст, в Memo этот текст отображается с новыми переносами строки. Не буду многословным, смотрите скрины.

Первоначальное состояние текста:
user posted image

После шифрования и дешифрования:
user posted image

Пожалуйста, помогите решить эту проблему.

Вот исходник класса, который занимается шифрованием/дешифрованием:

Код

class Cryptographer {
    public:
        static void Encryption(TStringList * list, UnicodeString key) {
            if (key == "") {
                return;
            }
            UnicodeString str;
            for (int i = 0; i < list->Count; i++) {
                str = list->Strings[i];
                for (int j = 1, k = key.Length(); j <= list->Strings[i].Length(); j++, k--) {
                    if (k == 0)
                    {
                        k = key.Length();
                    }
                    wchar_t symbol = int(str[j]) + int(key[k]);
                    str[j] = symbol;
                }
                list->Strings[i] = str;
            }
        }
        static void Decoding(TStringList *list, UnicodeString key) {
            if (key == "") {
                return;
            }
            UnicodeString str;
            for (int i = 0; i < list->Count; i++) {
                str = list->Strings[i];
                for (int j = 1, k = key.Length(); j <= list->Strings[i].Length(); j++, k--) {
                    if (k == 0)
                    {
                        k = key.Length();
                    }
                    wchar_t symbol = int(str[j]) - int(key[k]);
                    str[j] = symbol;
                }
                list->Strings[i] = str;
            }
        }
};


Вот функция, которая работает с этим классом:

Код

void TMainForm::EncryptOrDecrypt(int my_switch)
{
    if (my_switch != 0 && my_switch != 1) {
        return;
    }
    TStringList * list = new TStringList;
    list->AddStrings(MainMemo->Lines);
    wchar_t str[]={29408,30400,0};
    UnicodeString pass = str;

    if (my_switch == 0) {
        Cryptographer::Encryption(list, pass);
    }
    else {
        Cryptographer::Decoding(list, pass);
    }

    MainMemo->Clear();
    MainMemo->Lines->AddStrings(list);
    delete list;
}

Автор: xvr 7.2.2010, 12:38
Есть предположение, что поскольку кодируемый текст не является чистым ASCII (русская кодовая страница в Unicode начинается далеко не с 0), то в результате сложения кода с символом пароля могли появится Unicode символы переносов строк. Хотя в этом случае какие то буквы должны были быть съеденными.
Попробуй кодировать не построчно, а весь текст целиком (проперть Text у Memo)

Автор: gif0 7.2.2010, 13:44
xvr, спасибо, но проблема уже решена: http://forum.vingrad.ru/forum/topic-290557/anchor-entry2090832/0.html

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)