реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> ASCII в UNICODE, как преобразовать
chief_olimp
сообщение Dec 29 2008, 14:48
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 249
Регистрация: 31-10-05
Из: Украина Нетешин
Пользователь №: 10 344



Здраствуйте!!! Подскажите пожалуйста как преобразовать число из одного вида в другой. Мне кажется нужна таблица но пока не знаю как ее организовать. Спасибо!
P.S. Использую WinAvr но пример подойдет любой Сишный

Сообщение отредактировал chief_olimp - Dec 29 2008, 15:33
Go to the top of the page
 
+Quote Post
Александр Куличо...
сообщение Dec 29 2008, 17:02
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 256
Регистрация: 6-03-06
Из: Украина, г. Винница
Пользователь №: 15 017



Цитата(chief_olimp @ Dec 29 2008, 16:48) *
Здраствуйте!!! Подскажите пожалуйста как преобразовать число из одного вида в другой. Мне кажется нужна таблица но пока не знаю как ее организовать. Спасибо!
P.S. Использую WinAvr но пример подойдет любой Сишный

Символ в Unicode занимает 2 байта. Для цифр младший байт остается тем же что и в ASCII, а старший - либо 0x00, либо 0xFF.
http://www.unicode.org/charts/symbols.html

http://www.unicode.org/charts/PDF/U0000.pdf
http://www.unicode.org/charts/PDF/UFF00.pdf
Go to the top of the page
 
+Quote Post
chief_olimp
сообщение Dec 29 2008, 17:14
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 249
Регистрация: 31-10-05
Из: Украина Нетешин
Пользователь №: 10 344



ну это я знаю. Я наверное немного не правильно сформировал вопрос. Проблема в том что мне нужно преобразоввывать в UNICODE русские строки и при этом выводить их на ЖКИ. Т.е. на ЖКИ ANSII со всеми причудами вроде английских 'А','В','Х' и прочих схожих символов. Вот и придумал пока загнать в int массив последовательность по кодовой таблице ЖКИ? только UNICODE символы. А там по коду ANSII их выдергивать и отправлять. Это для формирования СМС русскими символами нужно. Тексты смс хранятся в EEPROM. Надеюсь понятно объяснил
Go to the top of the page
 
+Quote Post
WHALE
сообщение Dec 29 2008, 18:42
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



не знаю как остальные,а я опять не понял,что вы хотите sad.gif
1.вывод на жки(тип?)русских символов.
2.отправка СМС кирилицей.
3.И то и другое.
Проясните,плиз,ибо это абсолютно разные задачи,имхо,ничего общего друг с другом не имеющие.


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
Александр Куличо...
сообщение Dec 29 2008, 19:30
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 256
Регистрация: 6-03-06
Из: Украина, г. Винница
Пользователь №: 15 017



Цитата(chief_olimp @ Dec 29 2008, 19:14) *
ну это я знаю. Я наверное немного не правильно сформировал вопрос. Проблема в том что мне нужно преобразоввывать в UNICODE русские строки и при этом выводить их на ЖКИ. Т.е. на ЖКИ ANSII со всеми причудами вроде английских 'А','В','Х' и прочих схожих символов. Вот и придумал пока загнать в int массив последовательность по кодовой таблице ЖКИ? только UNICODE символы. А там по коду ANSII их выдергивать и отправлять. Это для формирования СМС русскими символами нужно. Тексты смс хранятся в EEPROM. Надеюсь понятно объяснил

Если я привильно понимаю, под "русскими строками" Вы понимаете последовательности символов из кодовой страницы CP1251.
Если исходные строки у Вас - CP1251, то, думаю, что наиболее удобно будет иметь 2 таблицы по 256 элементов каждая. Первая (типа char) - для перекодировки CP1251 в кода символов ЖК-индикатора, а вторая (unsigned int) - для перекодировки в Unicode. Хотя если небходимо сэкономить флеш и у Вас из CP1251 используются только русские строчные и заглавные символы (0xC0...0xFF), то Unicode-код можно получить из CP1251 прибавлением 0x0350. Но для украинских ї, є,г' это уже не подходит

Если же нужно отобразить принятый в Unicode текст на экране, то я бы сначала перекодировал в CP1251.
Понятно, что таблицей здесь уже не обойдешся. Поэтому, думаю, логично разбить символы на 3 группы:
1. с кодами от 0x0000(0x0020) до 0x007F.
2. с кодами от 0x0410 до 0x044F - русские символы
3. все остальные необходимые (є, ї, знак евро и т.п)
и преобразование каждой группы сделать отдельно.

Потом все это с помощью первой таблицы выводим на ЖК
Go to the top of the page
 
+Quote Post
chief_olimp
сообщение Dec 29 2008, 19:43
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 249
Регистрация: 31-10-05
Из: Украина Нетешин
Пользователь №: 10 344



Да нет похоже не то. За основу приходится брать вот эту таблицу Кодовая таблица для русифицированного индикатора И соответственно городить таблицу где каждому символу в таблице А соответствует символ в уникоде в таблице Б. Ну фактически таблица только одна и обращатся к ней нужно предварительно от ссылки отнимае некое число. У меня пока 160 но будет минимум 48
Go to the top of the page
 
+Quote Post
Александр Куличо...
сообщение Dec 29 2008, 21:23
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 256
Регистрация: 6-03-06
Из: Украина, г. Винница
Пользователь №: 15 017



Цитата(chief_olimp @ Dec 29 2008, 21:43) *
Да нет похоже не то. За основу приходится брать вот эту таблицу Кодовая таблица для русифицированного индикатора И соответственно городить таблицу где каждому символу в таблице А соответствует символ в уникоде в таблице Б. Ну фактически таблица только одна и обращатся к ней нужно предварительно от ссылки отнимае некое число. У меня пока 160 но будет минимум 48

Как раз ее я и имел ввиду, когда говорил о выводе символов на ЖК-индикатор. Только я предлагал перекодировку не напрямую, из Unicode в кода ЖК, а через кодировку CP-1251, т.е.
Unicode -> CP1251 -> ЖК.
На мой взгляд, этот вариант предпочтительней. Конечно, если не "жмут" такты. Тем более, что наверняка Вам придется выводить на ЖК-индикатор символы из CP1251 (При выводе на индикатор надписей из памяти программ)

P.S. Вот, немного набросал:
Код
__flash unsigned char CP1251_to_LCD_table[256]=
// 0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F  Lo        Hi
{
  0 ,  1 ,  2 ,  3 ,  4 ,  5 ,  6 ,  7 ,  8 ,  9 , 10 , 11 , 12 , 13 , 14 , 15 ,    // 0
16 , 17 , 18 , 19 , 20 , 21 , 22 , 23 , 24 , 25 , 26 , 27 , 28 , 29 , 30 , 31 , // 1
32 , 33 , 34 , 35 , 36 , 37 , 38 , 39 , 40 , 41 , 42 , 43 , 44 , 45 , 46 , 47 , // 2 !"#$%&''()*+,-./
48 , 49 , 50 , 51 , 52 , 53 , 54 , 55 , 56 , 57 , 58 , 59 , 60 , 61 , 62 , 63 , // 3 0123456789:;<=>?
64 , 65 , 66 , 67 , 68 , 69 , 70 , 71 , 72 , 73 , 74 , 75 , 76 , 77 , 78 , 79 , // 4 @ABCDEFGHIJKLMNO
80 , 81 , 82 , 83 , 84 , 85 , 86 , 87 , 88 , 89 , 90 , 91 , 92 , 93 , 94 , 95 , // 5 PQRSTUVWXYZ[\]^_
96 , 97 , 98 , 99 ,100 ,101 ,102 ,103 ,104 ,105 ,106 ,107 ,108 ,109 ,110 ,111 , // 6 `abcdefghijklmno
112 ,113 ,114 ,115 ,116 ,117 ,118 ,119 ,120 ,121 ,122 ,123 ,124 ,125 ,0xE9,127 , // 7 pqrstuvwxyz{|}~
32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , // 8 128-143
32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , // 9 144-159
32 , 32 , 32 , 32 , 32 ,  5 , 32 ,0xFD,0xA2, 32 ,0x01 ,0xC8, 32 , 32 , 32 ,0x03, // A 160-175
0xCB, 32 ,0x49,0x69,0x04, 32 ,0xFE,0xEF,0xB5,0xCC,0x00,0xC9, 32 , 32 , 32 ,0x02, // B 183 - градус
0x41,0xA0,0x42,0xA1,0xE0,0x45,0xA3,0xA4,0xA5,0xA6,0x4B,0xA7,0x4D,0x48,0x4F,0xA8, // C АБВГДЕЖЗИЙКЛМНОП
0x50,0x43,0x54,0xA9,0xAA,0x58,0xE1,0xAB,0xAC,0xE2,0xAD,0xAE,0x62,0xAF,0xB0,0xB1, // D РСТУФХЦЧШЩЪЫЬЭЮЯ
0x61,0xB2,0xB3,0xB4,0xE3,0x65,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0x6F,0xBE, // E абвгдежзийклмноп
0x70,0x63,0xBF,0x79,0xE4,0x78,0xE5,0xC0,0xC1,0xE6,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7}
; // F рстуфхцчшщъыьэюя


// аналогично таблица из CP1251 в Unicode
__flash unsigned int CP1251_to_Unicode[256]={
// 0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F  Lo        Hi
     // кода 0..127 передаются "как есть", с расширением до 2 байт
{  0 ,  1 ,  2 ,  3 ,  4 ,  5 ,  6 ,  7 ,  8 ,  9 , 10 , 11 , 12 , 13 , 14 , 15 , // 0
  16 , 17 , 18 , 19 , 20 , 21 , 22 , 23 , 24 , 25 , 26 , 27 , 28 , 29 , 30 , 31 , // 1
  32 , 33 , 34 , 35 , 36 , 37 , 38 , 39 , 40 , 41 , 42 , 43 , 44 , 45 , 46 , 47 , // 2 !"#$%&''()*+,-./
  48 , 49 , 50 , 51 , 52 , 53 , 54 , 55 , 56 , 57 , 58 , 59 , 60 , 61 , 62 , 63 , // 3 0123456789:;<=>?
  64 , 65 , 66 , 67 , 68 , 69 , 70 , 71 , 72 , 73 , 74 , 75 , 76 , 77 , 78 , 79 , // 4 @ABCDEFGHIJKLMNO
  80 , 81 , 82 , 83 , 84 , 85 , 86 , 87 , 88 , 89 , 90 , 91 , 92 , 93 , 94 , 95 , // 5 PQRSTUVWXYZ[\]^_
  96 , 97 , 98 , 99 ,100 ,101 ,102 ,103 ,104 ,105 ,106 ,107 ,108 ,109 ,110 ,111 , // 6 `abcdefghijklmno
112 ,113 ,114 ,115 ,116 ,117 ,118 ,119 ,120 ,121 ,122 ,123 ,124 ,125 ,126 ,127 , // 7 pqrstuvwxyz{|}~

     // Символы с СР1251-кодами 128...191 земенить на соответствующие им из Unicode
0x020,0x020,0x020,0x020,0x020,0x020,0x020,0x020,
0x020,0x020,0x020,0x020,0x020,0x020,0x020,0x020, // 8 128-143
0x020,0x020,0x020,0x020,0x020,0x020,0x020,0x020,
0x020,0x020,0x020,0x020,0x020,0x020,0x020,0x020, // 9 144-159
0x020,0x020,0x020,0x020,0x020,0x490,0x020,0x020,
0x020,0x020,0x414,0x020,0x020,0x020,0x020,0x020, // A 160-175  Г'  Є
0x020,0x020,0x020,0x020,0x020,0x020,0x020,0x020,
0x020,0x020,0x020,0x020,0x020,0x020,0x020,0x020 // B 176-191

0x410,0x411,0x412,0x413,0x414,0x415,0x416,0x417,
0x418,0x419,0x41A,0x41B,0x41C,0x41D,0x41E,0x41F, // C АБВГДЕЖЗИЙКЛМНОП
0x420,0x421,0x422,0x423,0x424,0x425,0x426,0x427,
0x428,0x429,0x42A,0x42B,0x42C,0x42D,0x42E,0x42F, // D РСТУФХЦЧШЩЪЫЬЭЮЯ
0x430,0x431,0x432,0x433,0x434,0x435,0x436,0x437,
0x438,0x439,0x43A,0x43B,0x43C,0x43D,0x43E,0x43F, // E абвгдежзийклмноп
0x440,0x441,0x442,0x443,0x444,0x445,0x446,0x447,
0x448,0x449,0x44A,0x44B,0x44C,0x44D,0x44E,0x44F,}; // F рстуфхцчшщъыьэюя

unsigned char Unicode_to_CP1251(unsigned int sym)  // Вариант 1
{
   if (sym <= 128) return (char)sym;
   if ((sym >= 0x410) && (sym <= 0x44F) return (sym - 0x350);
  switch (sym){
  case 0x490: return 0xA5  // Г'
  case 0x414: return 0xAA  // Є
  ......
  default return 0x20
  }
}


__flash unsigned char Unicode_to_CP1251_table[256] =
{
  ........
}

unsigned char Unicode_to_CP1251(unsigned int sym)  // Вариант 2
{
    if (sym <= 128) return (char)sym;   // ANSI
    if ((sym >>8) == 0x04) return Unicode_to_CP1251_table[sym & 0xFF];  // Cyrillic
    return 0x20;  // Other
  }
}


// Вывод строки в кодировке CP1251 на ЖК
while (*string){
    putLCD(CP1251_to_LCD_table[*string++]);
}

// Вывод строки в кодировке CP1251 в SMS
while (*string){
    putSMS(CP1251_to_Unicode_table[*string++]);
}

// Вывод строки в кодировке Unicode на ЖК
while (*string){
    putLCD( CP1251_to_LCD_table[ Unicode_to_CP1251(*string++) ] );
}
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 08:07
Рейтинг@Mail.ru


Страница сгенерированна за 0.01423 секунд с 7
ELECTRONIX ©2004-2016