Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Общетехнические вопросы

Общетехнические вопросы Общие вопросы аналоговой и цифровой электроники.

Ответ
 
Опции темы Опции просмотра
Старый 16.12.2016, 16:09   #1
Dmitriy_1000
Senior Member
 
Регистрация: 01.03.2007
Возраст: 20
Сообщений: 119
Вес репутации: 13/0
Dmitriy_1000 is on a distinguished road
По умолчанию Как работать с юникодом (Русскими символами)

Не получается разобраться как получить код Русского символа в кодировке UTF-16.
Есть переменная пусть это будит Русская буква А, в таблице юникода https://unicode-table.com/ru/#control-character код у нее 410h

Пишу такую программку
Код:
int main()
{
 wchar_t  h;
h = 'А';    
}
В переменной h получается 0xFFFFFFC0 , а я ожидал 410h.
Что делаю не так?
Dmitriy_1000 вне форума   Ответить с цитированием
Старый 16.12.2016, 16:40   #2
Dmitriy_1000
Senior Member
 
Регистрация: 01.03.2007
Возраст: 20
Сообщений: 119
Вес репутации: 13/0
Dmitriy_1000 is on a distinguished road
По умолчанию Re: Как работать с юникодом (Русскими символами)

Так будит более правильный вопрос.

Как можно получить номер символа в таблице unicode? Например, у символа "А" в русском варианте номер 0410.
Dmitriy_1000 вне форума   Ответить с цитированием
Старый 16.12.2016, 16:49   #3
IceS
Super Moderator
 
Регистрация: 01.03.2007
Адрес: St. Petersburg
Возраст: 38
Сообщений: 3,229
Вес репутации: 3684/105
IceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond repute
Отправить сообщение для IceS с помощью ICQ
По умолчанию Re: Как работать с юникодом (Русскими символами)

Цитата:
Сообщение от Dmitriy_1000 Посмотреть сообщение
Так будит более правильный вопрос.

Как можно получить номер символа в таблице unicode? Например, у символа "А" в русском варианте номер 0410.
1. стараться в контролерах не работать с уникодом (избыточность занимаемой памяти, а необходимость сомнительная).
2. здесь вряд ли кто-то с ним работает. Ищите другой форум (а лучше поиском в инете, где-то на вижуал си или билдере уже решали эти проблемы).
3. 'А' имеет определенный код, который соответствует символу русской буквы А (по-моему в 866 кодировке) и у юникоду отношения не имеет. Нужна функция перевода символа в юникод (см. пункт 2).
__________________
- Готово, мастер !!!
- Что готово ???
- Сломал ...
IceS вне форума   Ответить с цитированием
Старый 16.12.2016, 16:51   #4
IceS
Super Moderator
 
Регистрация: 01.03.2007
Адрес: St. Petersburg
Возраст: 38
Сообщений: 3,229
Вес репутации: 3684/105
IceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond repute
Отправить сообщение для IceS с помощью ICQ
По умолчанию Re: Как работать с юникодом (Русскими символами)

Цитата:
Сообщение от Dmitriy_1000 Посмотреть сообщение
Не получается разобраться как получить код Русского символа в кодировке UTF-16.
Есть переменная пусть это будит Русская буква А, в таблице юникода https://unicode-table.com/ru/#control-character код у нее 410h

Пишу такую программку
Код:
int main()
{
 wchar_t  h;
h = 'А';    
}
В переменной h получается 0xFFFFFFC0 , а я ожидал 410h.
Что делаю не так?
странно, wchar_t должен быть 16 бит, а 0xFFFFFFC0 - 32 бита. Что-то где-то неправильно.
__________________
- Готово, мастер !!!
- Что готово ???
- Сломал ...
IceS вне форума   Ответить с цитированием
Старый 16.12.2016, 18:15   #5
Sergey K
Senior Member
 
Регистрация: 23.10.2008
Адрес: Киев
Возраст: 34
Сообщений: 229
Вес репутации: 422/37
Sergey K is just really niceSergey K is just really niceSergey K is just really niceSergey K is just really niceSergey K is just really nice
По умолчанию Re: Как работать с юникодом (Русскими символами)

Как уже сказали - нужна функция AnsiToUTF16().
h = 'А' = 0хС0. Компилятор просто заменяет байт в кавычках согласно однобайтового Win1251. Если компилятор будет считывать листинг в UTF16, тогда и преобразовывать будет он как двухбайное UTF16.

Я с этим столкнулся в Lazarius, там было все наоборот, никак не мог понять, почему он кириллицу в однобайтный HEX неправильно переводит, а потом оказалось, что он все воспринимает как UTF16, а не Win1251
Sergey K вне форума   Ответить с цитированием
Старый 16.12.2016, 21:10   #6
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Orel
Возраст: 37
Сообщений: 4,211
Вес репутации: 4122/113
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: Как работать с юникодом (Русскими символами)

Цитата:
Сообщение от Dmitriy_1000 Посмотреть сообщение
Не получается разобраться как получить код Русского символа в кодировке UTF-16.
Есть переменная пусть это будит Русская буква А, в таблице юникода https://unicode-table.com/ru/#control-character код у нее 410h

Пишу такую программку
Код:
int main()
{
 wchar_t  h;
h = 'А';    
}
В переменной h получается 0xFFFFFFC0 , а я ожидал 410h.
Что делаю не так?
Цитата:
Сообщение от IceS Посмотреть сообщение
странно, wchar_t должен быть 16 бит, а 0xFFFFFFC0 - 32 бита. Что-то где-то неправильно.
IseS прав, размер типа wchar_t равен 2-м байтам
Код:
// Компилятор MinGW
wchar_t  h;
h = 'А';   // main.cpp:22:5: warning: multi-character character constant
cout << "sizeof(wchar_t) = " << sizeof(wchar_t)<< endl; // sizeof(wchar_t) = 2
Похоже, что вы даже не знаете, сколько байт занимает тип wchar_t.
И возраст у вас 20 лет, вы что в 10 лет на форуме зарегестрировались. Балуетесь все.
Возраст вроде как указывается при регистрации и его нельзя изменить.

PS: И компилятор XC8 с симулятором дает аналогичный результат, см.скриншот.
Миниатюры
MPLABX SIM UART.PNG  
__________________
Прогресс неизбежен.

Последний раз редактировалось Pridnya; 16.12.2016 в 21:30.
Pridnya на форуме   Ответить с цитированием
Старый 16.12.2016, 21:16   #7
ampersant
Senior Member
 
Аватар для ampersant
 
Регистрация: 26.02.2008
Адрес: IgorV
Сообщений: 2,160
Вес репутации: 4184/96
ampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond repute
По умолчанию Re: Как работать с юникодом (Русскими символами)

Цитата:
Сообщение от IceS Посмотреть сообщение
1. стараться в контролерах не работать с уникодом (избыточность занимаемой памяти, а необходимость сомнительная).
2. здесь вряд ли кто-то с ним работает. Ищите другой форум (а лучше поиском в инете, где-то на вижуал си или билдере уже решали эти проблемы).
3. 'А' имеет определенный код, который соответствует символу русской буквы А (по-моему в 866 кодировке) и у юникоду отношения не имеет. Нужна функция перевода символа в юникод (см. пункт 2).
ну как бы даже не вникал чего у меня было написано, просто это делалось для вывода через xml где без UTF8 русские буквы не получатся

текст из 1251 "изнутри" преобразовывался в utf8 для "снаружи"

постил сюда код, да вспомнил как поискать, я уже это постил более подробно

http://www.microchip.su/showpost.php...4&postcount=88
ampersant на форуме   Ответить с цитированием
Старый 16.12.2016, 23:26   #8
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 30
Сообщений: 1,298
Вес репутации: 2626/56
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Как работать с юникодом (Русскими символами)

В GNU/Linux тип wchar_t имеет размер 32 бита.
Действующий стандарт Unicode 6.х предполагает использование кода до 21-го бита, то есть до четырех байт в UTF-8.

для работы с utf-8 придется писать библиотеки. работа с utf-8 влечет накладные расходы.
besogon вне форума   Ответить с цитированием
Старый 17.12.2016, 08:47   #9
Vlad&mir
Senior Member
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 1,720
Вес репутации: 4345/90
Vlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond repute
По умолчанию Re: Как работать с юникодом (Русскими символами)

Цитата:
Сообщение от Dmitriy_1000 Посмотреть сообщение
Не получается разобраться как получить код Русского символа в кодировке UTF-16.
Есть переменная пусть это будит Русская буква А, в таблице юникода https://unicode-table.com/ru/#control-character код у нее 410h

Пишу такую программку
Код:
int main()
{
 wchar_t  h;
h = 'А';    
}
В переменной h получается 0xFFFFFFC0 , а я ожидал 410h.
Что делаю не так?
В юникоде символы кодируются двумя байтами, при этом первые 127 символов просто переводятся в HEX, а вот к кириллице добавляется 350h.

Пример: 1 – 0031, G – 0047, z — 007A, Ы — 042B, я — 044F

Код:
int main()
{
 unsigned int  h;
 h = 'А' + 0x350; 
}
Vlad&mir вне форума   Ответить с цитированием
Старый 17.12.2016, 09:21   #10
Vlad&mir
Senior Member
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 1,720
Вес репутации: 4345/90
Vlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond repute
По умолчанию Re: Как работать с юникодом (Русскими символами)

Цитата:
Сообщение от Vlad&mir Посмотреть сообщение
В юникоде символы кодируются двумя байтами, при этом первые 127 символов просто переводятся в HEX, а вот к кириллице добавляется 350h.

Пример: 1 – 0031, G – 0047, z — 007A, Ы — 042B, я — 044F

Код:
int main()
{
 unsigned int  h;
 h = 'А' + 0x350; 
}
Блин! Забыл: Ё и ё исключения!
'Ё' = 0xD081;
'ё' = 0xD191;
Vlad&mir вне форума   Ответить с цитированием
Старый 17.12.2016, 10:13   #11
maxxir
Member
 
Аватар для maxxir
 
Регистрация: 28.11.2010
Адрес: Тольятти
Возраст: 45
Сообщений: 47
Вес репутации: 491/28
maxxir is a glorious beacon of lightmaxxir is a glorious beacon of lightmaxxir is a glorious beacon of lightmaxxir is a glorious beacon of lightmaxxir is a glorious beacon of light
По умолчанию Re: Как работать с юникодом (Русскими символами)

Подкину пищу для размышления, UTF8->UCS2(UTF16), обработка cимволов латиницы и русской страницы UTF8
(в свое время убил пару недель на разбор полетов с этой перекодировкой, выдрано из своего
рабочего проекта GSM-SMS (sending Russian SMS via GSM modem TELIT GL868-Dual)).
Код:
/*
Доп инфо UTF-8 to UCS2 encoding:
http://i.voenmeh.ru/kafi5/Kam.loc/inform/UTF-8.htm  - !! Ошибка Буква <Ё> - 0xD081(UTF-8) -> 0x0401(Unicode)
http://www.sql.ru/forum/660795-2/otpravka-sms-cherez-grps-modem
* 
Online UTF8->UTF16 converter (неполный)
http://unicode.online-toolz.com/tools/text-unicode-entities-convertor.php
*/

//UTF8 to UCS2 encoder 
//!! Encode only Russian UTF-8 PAGE (all other codes made 0x003F(UCS2)  - "?")
void TELIT::UTF8_2_UCS2(const char * utf8_str, char * ucs2_str, unsigned int * ucs2_str_len)
{
    const unsigned char * Src;
    unsigned char * Dst;
    unsigned int Sym16;
    unsigned int Dst_len;
    Src = (const unsigned char *)utf8_str;
    Dst = (unsigned char *)ucs2_str;
    Dst_len = 0;
    /*
    PRINTF_DEBUG_F("UTF8_2_UCS2: ");
    PRINTF_DEBUG(Src);
    PRINTF_DEBUG_F("\r\n");
    */
    //Посимвольная обработка соообщения UTF8]
    //UTF-8 - Unicode - CP-1251 table look here:
    //http://i.voenmeh.ru/kafi5/Kam.loc/inform/UTF-8.htm - !! Ошибка Буква <Ё> - 0xD081(UTF-8) -> 0x0401(Unicode)
    while (*Src)
    {
        /*
        PRINTF_DEBUG_F(">>>0x");
        PRINTF_DEBUG(byte(Src[0]), HEX);
        PRINTF_DEBUG_F("\r\n");
        */

        // ASCII-7 символ - (основные знаки + eng)
        if(Src[0] <= 0x7F)
        {
            //PRINTF_DEBUG_F(">>>!!!\r\n");
            //PRINTF_DEBUG_F(">>>!!!if(Src[0] <= 0x7F)\r\n");
            Dst[0] = 0x0;
            Dst[1] = Src[0];
            Src += 1; // Сдвигаем указатель UTF-8 SRC
            Dst += 2; // Сдвигаем указатель UNICODE DEST
            Dst_len += 2; //Считаем  кол.-во символов в UCS2 - строке
        }
        // Буква <Ё> - 0xD081(UTF-8) -> 0x0401(Unicode)
        else if ((Src[0] == 0xD0)&&(Src[1] == 0x81))
        {
            Dst[0] = 0x04;
            Dst[1] = 0x01;
            Src += 2; // Сдвигаем указатель UTF-8 SRC
            Dst += 2; // Сдвигаем указатель UNICODE DEST
            Dst_len += 2; //Считаем  кол.-во символов в UCS2 - строке
        }
        // Буква <ё> - 0xD191(UTF-8) -> 0x0451(Unicode)
        else if ((Src[0] == 0xD1)&&(Src[1] == 0x91))
        {
            Dst[0] = 0x04;
            Dst[1] = 0x51;
            Src += 2; // Сдвигаем указатель UTF-8 SRC
            Dst += 2; // Сдвигаем указатель UNICODE DEST
            Dst_len += 2; //Считаем  кол.-во символов в UCS2 - строке
        }
        else if (Src[0] == 0xD0)
        {
            //PRINTF_DEBUG_F(">>>!!!else if (Src[0] == 0xD0)\r\n");
            //UTF-8 to Unicode Encode formula for [0xD090..0xD0BF](UTF-8)->[0x0410..0x043F](Unicode)
            if((Src[1]>= 0x90)&&(Src[1]<= 0xBF))
            {
                Sym16 =  Src[0];
                Sym16 = (Sym16<<8);
                Sym16 = Sym16+Src[1];
                Sym16 = Sym16 - 0xCC80;
                Dst[0] = (unsigned char)(Sym16>>8);
                Dst[1] = (unsigned char)Sym16;
            }
            else
            {
                // Unrecognized symbol
                Dst[0] = 0x00; //OUT symbol unknown <?>
                Dst[1] = 0x3F;
            }
            Src += 2; // Сдвигаем указатель UTF-8 SRC
            Dst += 2; // Сдвигаем указатель UNICODE DEST
            Dst_len += 2; //Считаем  кол.-во символов в UCS2 - строке
        }
        else if (Src[0] == 0xD1)
        {
            //UTF-8 to Unicode Encode formula for [0xD180..0xD18F](UTF-8)->[0x0440..0x044F](Unicode)
            if((Src[1]>= 0x80)&&(Src[1]<= 0x8F))
            {
                Sym16 =  Src[0];
                Sym16 = (Sym16<<8);
                Sym16 = Sym16+Src[1];
                Sym16 = Sym16 - 0xCD40;
                Dst[0] = (unsigned char)(Sym16>>8);
                Dst[1] = (unsigned char)Sym16;
            }
            else
            {
                // Unrecognized symbol
                Dst[0] = 0x00; //OUT symbol unknown <?>
                Dst[1] = 0x3F;
            }
            Src += 2; // Сдвигаем указатель UTF-8 SRC
            Dst += 2; // Сдвигаем указатель UNICODE DEST
            Dst_len += 2; //Считаем  кол.-во символов в UCS2 - строке
        }
        else
        {
            //PRINTF_DEBUG_F(">>>!!!Unknown symbol\r\n");
            //Unknown symbol
            Dst[0] = 0x00; //OUT symbol unknown <?>
            Dst[1] = 0x3F;
            Src ++; // Сдвигаем указатель UTF-8 SRC
            Dst += 2; // Сдвигаем указатель UNICODE DEST
            Dst_len += 2; //Считаем  кол.-во символов в UCS2 - строке
        }
    }//while (*Src)
     * ucs2_str_len = Dst_len;
}

void TELIT::GSM_ucs2_msg(char * rus_msg)
{
    //!! Encode UTF-8 to UCS2
    char ucs2_str[256] = "\0";
    unsigned int ucs2_str_len = 0;
    UTF8_2_UCS2(rus_msg, ucs2_str, &ucs2_str_len);


    //!! Out-string UCS-2 (This contens need to write into GSM-modem for Russian SMS messages)
    unsigned char i = 0;
    // Чекаем что длина сообщения не более 70-ти UCS-2 символов, т.е 140 "обычных" символов (UCS2 символ кодируется 2-мя символами)
    if (ucs2_str_len > 140)
    {
        ucs2_str_len = 140;
    }
    while(i < ucs2_str_len)
    {
        GSM_PRINT_BIN_2_HEX(ucs2_str[i++]);
    }
}
maxxir вне форума   Ответить с цитированием
Старый 19.12.2016, 08:35   #12
Dmitriy_1000
Senior Member
 
Регистрация: 01.03.2007
Возраст: 20
Сообщений: 119
Вес репутации: 13/0
Dmitriy_1000 is on a distinguished road
По умолчанию Re: Как работать с юникодом (Русскими символами)

Цитата:
Сообщение от Vlad&mir Посмотреть сообщение
В юникоде символы кодируются двумя байтами, при этом первые 127 символов просто переводятся в HEX, а вот к кириллице добавляется 350h.

Пример: 1 – 0031, G – 0047, z — 007A, Ы — 042B, я — 044F

Код:
int main()
{
 unsigned int  h;
 h = 'А' + 0x350; 
}
Всем большое спасибо что отозвались.
Vlad&mir, спасибо за ваш код. Для моей текущей задачи он подошёл.
только прибавлять мне пришлось не 0x350, а 0x450.

Всем удачи, и с наступающим НГ!!!
Dmitriy_1000 вне форума   Ответить с цитированием
Старый 19.12.2016, 21:02   #13
Vlad&mir
Senior Member
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 1,720
Вес репутации: 4345/90
Vlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond repute
По умолчанию Re: Как работать с юникодом (Русскими символами)

Цитата:
Сообщение от Dmitriy_1000 Посмотреть сообщение
...только прибавлять мне пришлось не 0x350, а 0x450.

Это потому, что Вы используете переменные со знаком (signed). Вообще говоря, всюду, где можно лучше применять unsigned, код короче.
Vlad&mir вне форума   Ответить с цитированием
Старый 20.12.2016, 01:16   #14
IceS
Super Moderator
 
Регистрация: 01.03.2007
Адрес: St. Petersburg
Возраст: 38
Сообщений: 3,229
Вес репутации: 3684/105
IceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond repute
Отправить сообщение для IceS с помощью ICQ
По умолчанию Re: Как работать с юникодом (Русскими символами)

Цитата:
Сообщение от Vlad&mir Посмотреть сообщение

Это потому, что Вы используете переменные со знаком (signed). Вообще говоря, всюду, где можно лучше применять unsigned, код короче.
Фигню, вы батенька, говорите.
short'у хоть сигнету, хоть ансигнету пофигу. что 350 , что 450 - результат будет такой же. В данном случае нет переноса в 8й бит старшего байта, и на знак выражение не повлияет.
Т.е.
Код:
unsigned short A=0; A+=0x350; //A=0x350
  signed short A=0; A+=0x350; //A=0x350
//и:
unsigned short A=0; A+=0x450; //A=0x450
  signed short A=0; A+=0x450; //A=0x450
__________________
- Готово, мастер !!!
- Что готово ???
- Сломал ...
IceS вне форума   Ответить с цитированием
Старый 20.12.2016, 11:13   #15
Vlad&mir
Senior Member
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 1,720
Вес репутации: 4345/90
Vlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond repute
По умолчанию Re: Как работать с юникодом (Русскими символами)

Цитата:
Сообщение от IceS Посмотреть сообщение
Фигню, вы батенька, говорите.
short'у хоть сигнету, хоть ансигнету пофигу. что 350 , что 450 - результат будет такой же. В данном случае нет переноса в 8й бит старшего байта, и на знак выражение не повлияет.
Т.е.
Код:
unsigned short A=0; A+=0x350; //A=0x350
  signed short A=0; A+=0x350; //A=0x350
//и:
unsigned short A=0; A+=0x450; //A=0x450
  signed short A=0; A+=0x450; //A=0x450

signed char xx;
signed int hh;


xx = 'А'; // А - русское!

hh = xx;

компилятор произвёл расширение знака и hh == 0xFFC0!

hh += 0x350;

Ну и hh == 0x310 !!!!

а если:

hh += 0x450;

то: hh == 0x410 !!!!

Что и соответствует действительности.

Как-то так, а Вы говорите пофигу!

P.S.
Если бы переменные были бы unsigned, то компилятор расширение знака не делал бы, hh было бы равно 0x00C0.

0x00C0 + 0x0350 = 0x0410 Это и есть unicod русской буквы А.

Последний раз редактировалось Vlad&mir; 20.12.2016 в 11:27.
Vlad&mir вне форума   Ответить с цитированием
Старый 20.12.2016, 11:30   #16
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Orel
Возраст: 37
Сообщений: 4,211
Вес репутации: 4122/113
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: Как работать с юникодом (Русскими символами)

Цитата:
Сообщение от Vlad&mir Посмотреть сообщение

signed char xx;
signed int hh;

xx = 'А'; // А - русское! Лучше в качестве примера выбрать букву Ш, чтобы лучше было понятно.

компилятор произвёл расширение знака и hh == 0xFFC0!
И написать, какой компилятор использовался, т.к. этот код ARMCC вообще не стал компилировать, ему не понравилось присвоение русского символа, выдал ошибку. А компилятор MinGW x32 собрал с двумя предупреждениями и выдал результат
Код:
signed char xx; 
signed int hh;

xx = 'Ш'; // main.c:40:6: warning: multi-character character constant
          // main.c:40:1: warning: overflow in implicit constant conversion
hh = xx;  // компилятор произвёл расширение знака и hh == 0xFFFFFFA8!
printf("hh = %d\n",hh); // -88
printf("hh = %x\n",hh); // 0xFFFFFFA8
printf("xx = %c\n",xx); // и 
hh += 0x350;
printf("hh = %d\n",hh); // 760
printf("hh = %x\n",hh); // 0x2F8
Получается, что код компиляторозависимый.
__________________
Прогресс неизбежен.

Последний раз редактировалось Pridnya; 20.12.2016 в 11:38.
Pridnya на форуме   Ответить с цитированием
Старый 20.12.2016, 11:40   #17
ampersant
Senior Member
 
Аватар для ampersant
 
Регистрация: 26.02.2008
Адрес: IgorV
Сообщений: 2,160
Вес репутации: 4184/96
ampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond repute
По умолчанию Re: Как работать с юникодом (Русскими символами)

а если попробовать так как я приводил
Код:
BYTE tmp;
WORD let; 
         let=tmp;// в tmp была буква 1251
             if(tmp==(BYTE)'Ё')  let = 0xD081;// исключения
             else
             if(tmp==(BYTE)'ё')  let = 0xD191;// исключения
             else
             if(tmp>=(BYTE)'А' && tmp<=(BYTE)'п' )       let += 0xD090 - 'А';
             else
             if(tmp>=(BYTE)'р' /* && tmp<=(BYTE)'я' */ ) let += 0xD180 - 'р';    
 // let имеет букву в кодировке UTF-8
ampersant на форуме   Ответить с цитированием
Старый 20.12.2016, 12:21   #18
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Orel
Возраст: 37
Сообщений: 4,211
Вес репутации: 4122/113
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: Как работать с юникодом (Русскими символами)

Цитата:
Сообщение от Vlad&mir Посмотреть сообщение

signed char xx;
signed int hh;


xx = 'А'; // А - русское!

hh = xx;

компилятор произвёл расширение знака и hh == 0xFFC0!

hh += 0x350;

Ну и hh == 0x310 !!!!

а если:

hh += 0x450;

то: hh == 0x410 !!!!
Всё правильно, если 'А' в кодировке CP1251. А я писал приложение в NetBeans для Windows, а исполнялось оно в MS-DOS (в кодирвке CP866 'и' = 0xA8).
__________________
Прогресс неизбежен.
Pridnya на форуме   Ответить с цитированием
Старый 20.12.2016, 14:05   #19
IceS
Super Moderator
 
Регистрация: 01.03.2007
Адрес: St. Petersburg
Возраст: 38
Сообщений: 3,229
Вес репутации: 3684/105
IceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond repute
Отправить сообщение для IceS с помощью ICQ
По умолчанию Re: Как работать с юникодом (Русскими символами)

Цитата:
Сообщение от Vlad&mir Посмотреть сообщение

signed char xx;
signed int hh;


xx = 'А'; // А - русское!

hh = xx;

компилятор произвёл расширение знака и hh == 0xFFC0!

hh += 0x350;

Ну и hh == 0x310 !!!!

а если:

hh += 0x450;

то: hh == 0x410 !!!!

Что и соответствует действительности.

Как-то так, а Вы говорите пофигу!

P.S.
Если бы переменные были бы unsigned, то компилятор расширение знака не делал бы, hh было бы равно 0x00C0.

0x00C0 + 0x0350 = 0x0410 Это и есть unicod русской буквы А.
Хм, действительно. Про расширение знака у 'А' я не подумал.
__________________
- Готово, мастер !!!
- Что готово ???
- Сломал ...
IceS вне форума   Ответить с цитированием
Старый 20.12.2016, 14:24   #20
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Orel
Возраст: 37
Сообщений: 4,211
Вес репутации: 4122/113
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: Как работать с юникодом (Русскими символами)

Если кто не понял, что здесь произошло (а я и сам не сразу понял), если набирать код в редакторе с кодировкой UTF8 (какая и была в настройках NetBeans 8.02), то вместо символа 'Ш' получим 'и':
Цитата:
signed char xx;
signed int hh;

xx = 'Ш'; // код символа 'Ш' в кодировке UTF8 равен 0xD0A8
// main.c:40:6: warning: multi-character character constant
// main.c:40:1: warning: overflow in implicit constant conversion
// Получили предупреждения о переполнении и xx стало равно 0xA8
hh = xx; // компилятор произвёл расширение знака и hh == 0xFFFFFFA8!
printf("hh = %d\n",hh); // -88
printf("hh = %x\n",hh); // 0xFFFFFFA8
printf("xx = %c\n",xx); // 'и' напечаталося символ cкодом 0xA8, кодировка CP866.
__________________
Прогресс неизбежен.
Pridnya на форуме   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как работать со структурами в асме SergeyKN Продукция MICROCHIP 16 01.07.2008 08:48
Подскажите как работать с PIC16F887 в С компиляторе HI-TECH??? gsm_storozh Продукция MICROCHIP 41 02.04.2008 12:44
Как в объявленной переменной обозначить биты? VAV Продукция MICROCHIP 4 28.02.2008 15:55
Как будут работать обычные ИМС при отрицательной температуре ??? dr_Sash Продукция MICROCHIP 27 27.11.2007 23:06
Как работать с прерываниями в С? Lunatic Продукция MICROCHIP 34 28.04.2007 20:37


Часовой пояс GMT +3, время: 23:06.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd. Перевод: zCarot