Руссификация SD1306(OLED 128x64)
- Войдите на сайт для отправки комментариев
Пнд, 13/10/2014 - 14:35
Всем привет. Работаю с дисплеем напрямую без библиотек(по даташиту). Все замечательно, но никак не могу добавить поддержку криллицы. Как я понял символы определены как последовательность байт в массиве. При использовании латинских символов просто считывается элемент массива индекс которого равен коду символа. Но как быть с кирилицей? Пробовал влоб вставить массив из вот этой статьи, но ничего не выходит. Печатается только "Hello World". Куда копать? Заранее спасибо!
#define SSD1306_LCDWIDTH 128 #define SSD1306_LCDHEIGHT 64 #define SSD1306_OLED_ADDRESS 0x3C #define SSD1306_COLUMNADDR 0x21 #define SSD1306_PAGEADDR 0x22 #define SSD1306_COMMAND_MODE 0x80 #define SSD1306_DATA_MODE 0x40 #define SSD1306_DISPLAYOFF 0xAE #define SSD1306_DISPLAYON 0xAF #define SSD1306_SETDISPLAYCLOCKDIV 0xD5 #define SSD1306_SETMULTIPLEX 0xA8 #define SSD1306_SETDISPLAYOFFSET 0xD3 #define SSD1306_SETSTARTLINE 0x40 #define SSD1306_CHARGEPUMP 0x8D #define SSD1306_MEMORYMODE 0x20 #define SSD1306_COLUMNADDR 0x21 #define SSD1306_PAGEADDR 0x22 #define SSD1306_COMSCANINC 0xC0 #define SSD1306_COMSCANDEC 0xC8 #define SSD1306_SEGREMAP 0xA0 #define SSD1306_SETCONTRAST 0x81 #define SSD1306_SETCOMPINS 0xDA #define SSD1306_SETPRECHARGE 0xD9 #define SSD1306_SETVCOMDETECT 0xDB #define SSD1306_DISPLAYALLON_RESUME 0xA4 #define SSD1306_NORMALDISPLAY 0xA6 #define SSD1306_INVERTDISPLAY 0xA7 #define BLACK 0 #define WHITE 1 #define INVERSE 2 #define I2C_400KHZ 1 #include <Wire.h> const byte BasicFont[][5] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00,// (space) 0x20 0x00, 0x00, 0x5F, 0x00, 0x00,// ! 0x21 0x00, 0x07, 0x00, 0x07, 0x00,// " 0x22 0x14, 0x7F, 0x14, 0x7F, 0x14,// # 0x23 0x24, 0x2A, 0x7F, 0x2A, 0x12,// $ 0x24 0x23, 0x13, 0x08, 0x64, 0x62,// % 0x25 0x36, 0x49, 0x55, 0x22, 0x50,// & 0x26 0x00, 0x05, 0x03, 0x00, 0x00,// ' 0x27 0x00, 0x1C, 0x22, 0x41, 0x00,// ( 0x28 0x00, 0x41, 0x22, 0x1C, 0x00,// ) 0x29 0x08, 0x2A, 0x1C, 0x2A, 0x08,// * 0x2A 0x08, 0x08, 0x3E, 0x08, 0x08,// + 0x2B 0x00, 0x50, 0x30, 0x00, 0x00,// , 0x2C 0x08, 0x08, 0x08, 0x08, 0x08,// - 0x2D 0x00, 0x60, 0x60, 0x00, 0x00,// . 0x2E 0x20, 0x10, 0x08, 0x04, 0x02,// / 0x2F 0x3E, 0x51, 0x49, 0x45, 0x3E,// 0x30 0x00, 0x42, 0x7F, 0x40, 0x00,// 1 0x31 0x42, 0x61, 0x51, 0x49, 0x46,// 2 0x32 0x21, 0x41, 0x45, 0x4B, 0x31,// 3 0x33 0x18, 0x14, 0x12, 0x7F, 0x10,// 4 0x34 0x27, 0x45, 0x45, 0x45, 0x39,// 5 0x35 0x3C, 0x4A, 0x49, 0x49, 0x30,// 6 0x36 0x01, 0x71, 0x09, 0x05, 0x03,// 7 0x37 0x36, 0x49, 0x49, 0x49, 0x36,// 8 0x38 0x06, 0x49, 0x49, 0x29, 0x1E,// 9 0x39 0x00, 0x36, 0x36, 0x00, 0x00,// : 0x3A 0x00, 0x56, 0x36, 0x00, 0x00,// ; 0x3B 0x00, 0x08, 0x14, 0x22, 0x41,// < 0x3C 0x14, 0x14, 0x14, 0x14, 0x14,// = 0x3D 0x41, 0x22, 0x14, 0x08, 0x00,// > 0x3E 0x02, 0x01, 0x51, 0x09, 0x06,// ? 0x3F 0x32, 0x49, 0x79, 0x41, 0x3E,// @ 0x40 0x7E, 0x11, 0x11, 0x11, 0x7E,// A 0x41 0x7F, 0x49, 0x49, 0x49, 0x36,// B 0x42 0x3E, 0x41, 0x41, 0x41, 0x22,// C 0x43 0x7F, 0x41, 0x41, 0x22, 0x1C,// D 0x44 0x7F, 0x49, 0x49, 0x49, 0x41,// E 0x45 0x7F, 0x09, 0x09, 0x01, 0x01,// F 0x46 0x3E, 0x41, 0x41, 0x51, 0x32,// G 0x47 0x7F, 0x08, 0x08, 0x08, 0x7F,// H 0x48 0x00, 0x41, 0x7F, 0x41, 0x00,// I 0x49 0x20, 0x40, 0x41, 0x3F, 0x01,// J 0x4A 0x7F, 0x08, 0x14, 0x22, 0x41,// K 0x4B 0x7F, 0x40, 0x40, 0x40, 0x40,// L 0x4C 0x7F, 0x02, 0x04, 0x02, 0x7F,// M 0x4D 0x7F, 0x04, 0x08, 0x10, 0x7F,// N 0x4E 0x3E, 0x41, 0x41, 0x41, 0x3E,// O 0x4F 0x7F, 0x09, 0x09, 0x09, 0x06,// P 0x50 0x3E, 0x41, 0x51, 0x21, 0x5E,// Q 0x51 0x7F, 0x09, 0x19, 0x29, 0x46,// R 0x52 0x46, 0x49, 0x49, 0x49, 0x31,// S 0x53 0x01, 0x01, 0x7F, 0x01, 0x01,// T 0x54 0x3F, 0x40, 0x40, 0x40, 0x3F,// U 0x55 0x1F, 0x20, 0x40, 0x20, 0x1F,// V 0x56 0x7F, 0x20, 0x18, 0x20, 0x7F,// W 0x57 0x63, 0x14, 0x08, 0x14, 0x63,// X 0x58 0x03, 0x04, 0x78, 0x04, 0x03,// Y 0x59 0x61, 0x51, 0x49, 0x45, 0x43,// Z 0x5A 0x00, 0x00, 0x7F, 0x41, 0x41,// [ 0x5B 0x02, 0x04, 0x08, 0x10, 0x20,// "\" 0x5C 0x41, 0x41, 0x7F, 0x00, 0x00,// ] 0x5D 0x04, 0x02, 0x01, 0x02, 0x04,// ^ 0x5E 0x40, 0x40, 0x40, 0x40, 0x40,// _ 0x5F 0x00, 0x01, 0x02, 0x04, 0x00,// ` 0x60 0x20, 0x54, 0x54, 0x54, 0x78,// a 0x61 0x7F, 0x48, 0x44, 0x44, 0x38,// b 0x62 0x38, 0x44, 0x44, 0x44, 0x20,// c 0x63 0x38, 0x44, 0x44, 0x48, 0x7F,// d 0x64 0x38, 0x54, 0x54, 0x54, 0x18,// e 0x65 0x08, 0x7E, 0x09, 0x01, 0x02,// f 0x66 0x08, 0x14, 0x54, 0x54, 0x3C,// g 0x67 0x7F, 0x08, 0x04, 0x04, 0x78,// h 0x68 0x00, 0x44, 0x7D, 0x40, 0x00,// i 0x69 0x20, 0x40, 0x44, 0x3D, 0x00,// j 0x6A 0x00, 0x7F, 0x10, 0x28, 0x44,// k 0x6B 0x00, 0x41, 0x7F, 0x40, 0x00,// l 0x6C 0x7C, 0x04, 0x18, 0x04, 0x78,// m 0x6D 0x7C, 0x08, 0x04, 0x04, 0x78,// n 0x6E 0x38, 0x44, 0x44, 0x44, 0x38,// o 0x6F 0x7C, 0x14, 0x14, 0x14, 0x08,// p 0x70 0x08, 0x14, 0x14, 0x18, 0x7C,// q 0x71 0x7C, 0x08, 0x04, 0x04, 0x08,// r 0x72 0x48, 0x54, 0x54, 0x54, 0x20,// s 0x73 0x04, 0x3F, 0x44, 0x40, 0x20,// t 0x74 0x3C, 0x40, 0x40, 0x20, 0x7C,// u 0x75 0x1C, 0x20, 0x40, 0x20, 0x1C,// v 0x76 0x3C, 0x40, 0x30, 0x40, 0x3C,// w 0x77 0x44, 0x28, 0x10, 0x28, 0x44,// x 0x78 0x0C, 0x50, 0x50, 0x50, 0x3C,// y 0x79 0x44, 0x64, 0x54, 0x4C, 0x44,// z 0x7A 0x00, 0x08, 0x36, 0x41, 0x00,// { 0x7B 0x00, 0x00, 0x7F, 0x00, 0x00,// | 0x7C 0x00, 0x41, 0x36, 0x08, 0x00,// } 0x7D 0x08, 0x08, 0x2A, 0x1C, 0x08,// -> 0x7E 0x08, 0x1C, 0x2A, 0x08, 0x08, // <- 0x7F 0x7C, 0x14, 0x14, 0x14, 0x08,//p 0x80 0x38, 0x44, 0x44, 0x44, 0x20,//c 0x81 0x04, 0x04, 0x7c, 0x04, 0x04,//т 0x82 0x0C, 0x50, 0x50, 0x50, 0x3C,//у 0x83 0x30, 0x48, 0xfc, 0x48, 0x30,//ф 0x84 0x44, 0x28, 0x10, 0x28, 0x44,//x 0x85 0x7c, 0x40, 0x40, 0x40, 0xfc,//ц 0x86 0x0c, 0x10, 0x10, 0x10, 0x7c,//ч 0x87 0x7c, 0x40, 0x7c, 0x40, 0x7c,//ш 0x88 0x7c, 0x40, 0x7c, 0x40, 0xfc,//щ 0x89 0x04, 0x7c, 0x50, 0x50, 0x20,//ъ 0x8A 0x7c, 0x50, 0x50, 0x20, 0x7c,//ы 0x8B 0x7c, 0x50, 0x50, 0x20, 0x00,//ь 0x8C 0x28, 0x44, 0x54, 0x54, 0x38,//э 0x8D 0x7c, 0x10, 0x38, 0x44, 0x38,//ю 0x8E 0x08, 0x54, 0x34, 0x14, 0x7c,//я 0x8F 0x7e, 0x11, 0x11, 0x11, 0x7e,//A 0x90 0x7f, 0x49, 0x49, 0x49, 0x33,//Б 0x91 0x7f, 0x49, 0x49, 0x49, 0x36,//В 0x92 0x7f, 0x01, 0x01, 0x01, 0x03,//Г 0x93 0xe0, 0x51, 0x4f, 0x41, 0xff,//Д 0x94 0x7f, 0x49, 0x49, 0x49, 0x41,//E 0x95 0x77, 0x08, 0x7f, 0x08, 0x77,//Ж 0x96 0x41, 0x49, 0x49, 0x49, 0x36,//З 0x97 0x7f, 0x10, 0x08, 0x04, 0x7f,//И 0x98 0x7c, 0x21, 0x12, 0x09, 0x7c,//Й 0x99 0x7f, 0x08, 0x14, 0x22, 0x41,//K 0x9A 0x20, 0x41, 0x3f, 0x01, 0x7f,//Л 0x9B 0x7f, 0x02, 0x0c, 0x02, 0x7f,//M 0x9C 0x7f, 0x08, 0x08, 0x08, 0x7f,//H 0x9D 0x3e, 0x41, 0x41, 0x41, 0x3e,//O 0x9E 0x7f, 0x01, 0x01, 0x01, 0x7f,//П 0x9F 0x7f, 0x09, 0x09, 0x09, 0x06,//P 0xA0 0x3e, 0x41, 0x41, 0x41, 0x22,//C 0xA1 0x01, 0x01, 0x7f, 0x01, 0x01,//T 0xA2 0x47, 0x28, 0x10, 0x08, 0x07,//У 0xA3 0x1c, 0x22, 0x7f, 0x22, 0x1c,//Ф 0xA4 0x63, 0x14, 0x08, 0x14, 0x63,//X 0xA5 0x7f, 0x40, 0x40, 0x40, 0xff,//Ц 0xA6 0x07, 0x08, 0x08, 0x08, 0x7f,//Ч 0xA7 0x7f, 0x40, 0x7f, 0x40, 0x7f,//Ш 0xA8 0x7f, 0x40, 0x7f, 0x40, 0xff,//Щ 0xA9 0x01, 0x7f, 0x48, 0x48, 0x30,//Ъ 0xAA 0x7f, 0x48, 0x30, 0x00, 0x7f,//Ы 0xAB 0x00, 0x7f, 0x48, 0x48, 0x30,//Э 0xAC 0x22, 0x41, 0x49, 0x49, 0x3e,//Ь 0xAD 0x7f, 0x08, 0x3e, 0x41, 0x3e,//Ю 0xAE 0x46, 0x29, 0x19, 0x09, 0x7f,//Я 0xAF 0x20, 0x54, 0x54, 0x54, 0x78,//a 0xB0 0x3c, 0x4a, 0x4a, 0x49, 0x31,//б 0xB1 0x7c, 0x54, 0x54, 0x28, 0x00,//в 0xB2 0x7c, 0x04, 0x04, 0x04, 0x0c,//г 0xB3 0xe0, 0x54, 0x4c, 0x44, 0xfc,//д 0xB4 0x38, 0x54, 0x54, 0x54, 0x18,//e 0xB5 0x6c, 0x10, 0x7c, 0x10, 0x6c,//ж 0xB6 0x44, 0x44, 0x54, 0x54, 0x28,//з 0xB7 0x7c, 0x20, 0x10, 0x08, 0x7c,//и 0xB8 0x7c, 0x41, 0x22, 0x11, 0x7c,//й 0xB9 0x7c, 0x10, 0x28, 0x44, 0x00,//к 0xBA 0x20, 0x44, 0x3c, 0x04, 0x7c,//л 0xBB 0x7c, 0x08, 0x10, 0x08, 0x7c,//м 0xBC 0x7c, 0x10, 0x10, 0x10, 0x7c,//н 0xBD 0x38, 0x44, 0x44, 0x44, 0x38,//o 0xBE 0x7c, 0x04, 0x04, 0x04, 0x7c //п 0xBF }; void setup(){ initDisplay(); printString("Hello!",0,0,6); printString("Привет!",0,1,7); } void loop(){ } //Инициализация дисплея void initDisplay(){ if (I2C_400KHZ){ // save I2C bitrate (default 100Khz) byte twbrbackup = TWBR; TWBR = 12; //TWBR = twbrbackup; //Serial.println(TWBR, DEC); //Serial.println(TWSR & 0x3, DEC); } sendCommand(SSD1306_DISPLAYOFF);//Выключаем дисплей sendCommand(SSD1306_SETDISPLAYCLOCKDIV);//Синхронизация тактирования походу :) sendCommand(SSD1306_COMMAND_MODE);//Drk.xftv ht;bv sendCommand(SSD1306_SETMULTIPLEX); sendCommand(0x3F); sendCommand(SSD1306_SETDISPLAYOFFSET); sendCommand(0x00); sendCommand(SSD1306_SETSTARTLINE | 0x0); // line #0 sendCommand(SSD1306_CHARGEPUMP); // 0x8D sendCommand(0x14); // [2] charge pump setting (p62): 0x014 enable, 0x010 disable sendCommand(SSD1306_MEMORYMODE); // 0x20 sendCommand(0x00); // 0x0 act like ks0108 sendCommand(SSD1306_SEGREMAP | 0x1); sendCommand(SSD1306_COMSCANDEC); sendCommand(SSD1306_SETCOMPINS); // 0xDA sendCommand(0x12); sendCommand(SSD1306_SETCONTRAST); sendCommand(0xCF); sendCommand(SSD1306_SETPRECHARGE); sendCommand(0xF1); sendCommand(SSD1306_SETVCOMDETECT); // 0xDB sendCommand(0x40); sendCommand(SSD1306_DISPLAYALLON_RESUME); // 0xA4 sendCommand(SSD1306_NORMALDISPLAY); // 0xA6 sendCommand(SSD1306_DISPLAYON); } void printChar(byte C, byte X, byte Y){ setCursor(X,Y); for(byte i=0; i<5; i++) { sendData(pgm_read_byte(&BasicFont[C-32][i])); } } void printString(const char *String, byte X, byte Y, byte numChar){ byte cursor = X; byte count=0; while(String[count] && count<numChar){ setCursor(cursor, Y); printChar(String[count++],cursor,Y); cursor+=8; } } void setCursor(byte x, byte y){ sendCommand(SSD1306_COLUMNADDR); sendCommand(x); sendCommand(x+6); sendCommand(SSD1306_PAGEADDR); sendCommand(y); sendCommand(y); } void invertDisplay(uint8_t i) { if (i) { sendCommand(SSD1306_INVERTDISPLAY); } else { sendCommand(SSD1306_NORMALDISPLAY); } } void sendCommand(byte command){ Wire.beginTransmission(SSD1306_OLED_ADDRESS); Wire.write(0x00); Wire.write(command); Wire.endTransmission(); } void sendData(byte command){ Wire.beginTransmission(SSD1306_OLED_ADDRESS); Wire.write(0x40); Wire.write(command); Wire.endTransmission(); }
В ветке Общий есть та же тема только для дисплея 5110
Основная проблема это определение кода кирилического символа который нужно выводить - ведь корилица в юникоде состоит из 2 байт(первый это номер таблицы, второй код символа в таблице), а у вас нет проверки байта таблицы -эти байты нужно пропускать.
Основная проблема это определение кода кирилического символа который нужно выводить - ведь корилица в юникоде состоит из 2 байт(первый это номер таблицы, второй код символа в таблице), а у вас нет проверки байта таблицы -эти байты нужно пропускать.
К сожалению не работает. Кирилица в кракозябрах и латиница кривовата стала :)
я что за вас еще считать все должен? Все смещения? Вы вообще поняли что я имелл вииду? Таблицу символов виндовую откройте хотябы.
Учитесь думать прежде чем что-то вставить.
А еще надо сделать правильной вашу таблицу там со смещением 0x60 должны быть Буквы АБВГДЕЖЗИКЛМН
я что за вас еще считать все должен? Все смещения? Вы вообще поняли что я имелл вииду? Таблицу символов виндовую откройте хотябы.
Учитесь думать прежде чем что-то вставить.
Спасибо за помощь конечно. Но я не понял причем тут смещения? В данном массиве графические представления символов.
Ну для не понятных скажу еще раз - ваша таблица начинается с 0х20 - тоесть 0x20(код символа) должно стать равно 0х00(данные символа) - вот 0х20 это смещение для сопоставление ANSI таблицы(0x00 таблица в юникоде) и вашей таблицы данных(чтобы считать нужные данные).
А чтобы сопоставить таблицу кирилицы юникода к вашей таблице данных нужно рассчитать смещение - потому что вы используете не все символы из 0х04 таблицы юникода. В таблице идут вначале заглавные буквы, потом строчные - данные нужно привести к этому же виду. И если таблица 0х04 то смещение должно быть таким чтобы код 0х10 (символ) указывал на букву "А" в таблице данных. В таблице данных буква А стоит(должна быть там после этих стрелок) на позиции 0х60 и ее код 0х10 - значит к коду символа нужно добавлять 0х50 (0х10+0х50 = 0х60).
Ну для не понятных скажу еще раз - ваша таблица начинается с 0х20 - тоесть 0x20(код символа) должно стать равно 0х00(данные символа) - вот 0х20 это смещение для сопоставление ANSI таблицы(0x00 таблица в юникоде) и вашей таблицы данных(чтобы считать нужные данные).
А чтобы сопоставить таблицу кирилицы юникода к вашей таблице данных нужно рассчитать смещение - потому что вы используете не все символы из 0х04 таблицы юникода. В таблице идут вначале заглавные буквы, потом строчные - данные нужно привести к этому же виду. И если таблица 0х04 то смещение должно быть таким чтобы код 0х10 (символ) указывал на букву "А" в таблице данных. В таблице данных буква А стоит(должна быть там после этих стрелок) на позиции 0х60 и ее код 0х10 - значит к коду символа нужно добавлять 0х50 (0х10+0х50 = 0х60).
К сожалению я вас не понимаю. Причем тут коды символов в UTF и ASCII? В этом массиве предствлено графическое отображение каждого символа. Если к примеру символ '!', то возьмется 1(первый) элемент массива и все его байты(8*8) будут отправлены на дисплей. Где 0 это потушить пиксель а 1 зажечь. Причем тут преобразование? :)
Вот еще пример(только латинские символы) 8х8 пикселей:
Как Вам повезло, что пухлявый дрыхнет... Вам пытаются объяснить что у вас допустим второй элемент массива это "!", а символ его вызывающий имеет код допустим 21. А 21 элемент массива какую букву будет отображать?
он думает если в комментах рядом написана буква ардуина знает что строка рядом это для него))
Автор вообще смутно понимает как работает этот код. Скопировал где-то пример непонятно для какой кодовой таблицы(той в которой строки в программе).
З.Ы. Напоминает одну сказку где парень засунул дрова в печку в перемешку с тестом со словами "Зажарится как нибудь", чтобы получились прожки - и был искренне недоволен результатом, когда получил черные пирожки.
он думает если в комментах рядом написана буква ардуина знает что строка рядом это для него))
А вы юморист :)
Автор вообще смутно понимает как работает этот код. Скопировал где-то пример непонятно для какой кодовой таблицы(той в которой строки в программе).
З.Ы. Напоминает одну сказку где парень засунул дрова в печку в перемешку с тестом со словами "Зажарится как нибудь", чтобы получились прожки - и был искренне недоволен результатом, когда получил черные пирожки.
Да, так и есть. Часть кода (таблица символов) скопированна. Разве я не правильно понимаю что индекс элемента массива должен быть равен коду символа в ASCII таблице?
Как Вам повезло, что пухлявый дрыхнет... Вам пытаются объяснить что у вас допустим второй элемент массива это "!", а символ его вызывающий имеет код допустим 21. А 21 элемент массива какую букву будет отображать?
Да уж. Мной смотрю уже детей пугают. Гыыыы
а он кстати и не поймет то что вы ему обьясняете. Ибо тупит страшно. У него даже не хватает соображения что бы в этот код вставить serial.print и посмотреть что ему его масив возращает. А вы ему сразу про кодировки и прочую лабуду.
Как Вам повезло, что пухлявый дрыхнет... Вам пытаются объяснить что у вас допустим второй элемент массива это "!", а символ его вызывающий имеет код допустим 21. А 21 элемент массива какую букву будет отображать?
Проснулись(с ДВ?)? Вот зря так. Вовзращает код символа. Но не понятно к какой таблице символов.
Незря!
только не разбирающийся новичек будет сходу кричать что он крут и обошелся без библиотек. :) потому что нормальные здоровые люди не тратят время на изобретения лисапедов. Гыыы избавиться от библиотеки легко. Просто нужно весь код с библиотеки вынести в основное тело программы.
к тому-же вас уже несколько раз ткнули там где проблема. Но вам начхать ибо вы не знаете как изменить код. И видимо ждете что кто это сделает за вас.
Так что НЕЗРЯ!
Оооккк... Гуру. Мне доказывать кому-то что-то давно не нужно. Тем более тут. Спасибо.
Дадада.
В данный момент у вас элементарная задача. Взять с массива нужный элемент. Но вы не можете решить эту задачу. Хотя
1. Вам указали в чем ошибка
2. Вам сказали что есть ветка где решали похожую проблему
Давайте теперь подумаем почему вы еще не решили свою проблему?
Потому что я живу на ДВ и сейчас середина дня. Потому что я сейчас на работе.
Потому что я живу на ДВ и сейчас середина дня. Потому что я сейчас на работе.
Ой, вы оправдываетесь и что то мне доказываете? Ужас
Ну предыдущим вечером целой группе народа так и не удалось донести до вас истину. Посмотрим сегодня.
У нас не принято писать за кого то код. Обьяснять, советоваться, философию почесывать эт сколько угодно. А поощрять заносчивых новичков писанием за них кода, зачем?
Вот так можно посмотреть какие коды соответвуют символам. Если вы запустите пример то увидите что кодовая таблица получается 0xD0, А русские буквы начинаются с 0x90. Тут про это написано: http://fkn.ktu10.com/?q=node/5542
Вот так можно посмотреть какие коды соответвуют символам. Если вы запустите пример то увидите что кодовая таблица получается 0xD0, А русские буквы начинаются с 0x90. Тут про это написано: http://fkn.ktu10.com/?q=node/5542
Вообщем если я вас правильно понял, то мне нужно следущее...
Массив латинских символов ASCII таблица.
Добавляю в него русские символы и в случае использования кирилицы мне нужно вычислить нужный индекс элемента? Т.е к примеру если я сейчас вот в этот массив добавлю 97 элемент, в котором будет "А" что будет равно индексу 144(UNICODE), то следовательно можно вычислить длинну смещения в данной(моей) таблице как 144-97=47... Далее 144-47 = 97. Так? Я совсем запутался уже.
Вам в любом случае нужно учитывать смещения. У вас "BasicFont[5]" будет рисовать символ "#", при том, что символ решетки имеет код 0x23 и когда вы пытаетесь вызвать BasicFont['#'] это равно BasicFont[35], который будет рисовать символ "C"
Вам в любом случае нужно учитывать смещения. У вас "BasicFont[5]" будет рисовать символ "#", при том, что символ решетки имеет код 0x23 и когда вы пытаетесь вызвать BasicFont['#'] это равно BasicFont[35], который будет рисовать символ "C"
Это имеется в виду?
о до человека дошло))
Да, но это не касается кириллицы. У нее другие смещения, смотрите соседнюю ветку, там уже все посчитали.
о до человека дошло))
Не только это дошло, но и то что VS в другой кодировке собирала проект :))))
и еще. несколько условий ставится если требуется уменьшить занимаемый объем массивом символов. и тогда делается массив с нужными символами. например только русские буквы и цифры. и условиями и смещениями получаем нужные строки массива
Да, но это не касается кириллицы. У нее другие смещения, смотрите соседнюю ветку, там уже все посчитали.
Ну не беда. Можно ведь проверит. Но до этого момента мне надо как-то понять что надо читать второй байт... Хм.
в смысле 2 байт? буква из 5 байт. из них второй байт?
Ну не беда. Можно ведь проверит. Но до этого момента мне надо как-то понять что надо читать второй байт... Хм.
Ну так вам написали код, для проверки, какие байты к вам приходят, когда вы отправляете определенный русский символ, а уж зная эту информацию легко отсеит ненужные (если они есть) и сместить нужные
в смысле 2 байт? буква из 5 байт. из них второй байт?
Не не не.. Не так поняли. Я не про то. Вот у меня есть метод:
В него прилетает кирилический символ "А"... Но значением(индексом) в таблице Unicode является 2-ой байт.
в смысле 2 байт? буква из 5 байт. из них второй байт?
я думаю он имеет ввиду юникод, в котором каждый воторой символ нужно отбросить
а что проблема отсеять 1 байт? вот например как использовать старший
а младший сам отсеется если в переменную типа байт отправить unsigned int
а что проблема отсеять 1 байт? вот например как использовать старший
а младший сам отсеется если в переменную типа байт отправить unsigned int
Ну или как вариант смотреть если прилетело 0xEF, то смещаться на 1 байт вперед?
в смысле 2 байт? буква из 5 байт. из них второй байт?
я думаю он имеет ввиду юникод, в котором каждый воторой символ нужно отбросить
в юникоде возвращается значение 0xD8F7 например из 2 байт или два раза по байту? не понял честно сказать
в смысле 2 байт? буква из 5 байт. из них второй байт?
я думаю он имеет ввиду юникод, в котором каждый воторой символ нужно отбросить
в юникоде возвращается значение 0xD8F7 например из 2 байт или два раза по байту? не понял честно сказать
Я имею в виду это: "Как определить в методе printChar что в него передан кирилический символ?"
а что проблема отсеять 1 байт? вот например как использовать старший
а младший сам отсеется если в переменную типа байт отправить unsigned int
блин ошибочка. отсеется конечно старший байт если в переменную типа байт отправить unsigned int
Я имею в виду это: "Как определить в методе printChar что в него передан кирилический символ?"
так пример кода дали как посмотреть коды букв. даже не зная кодировки уже можно сделать по этим данным
а то что кириллица или латиница неважно. все равно вернется код символа. просто он будет в какой то другой части таблицы используемой кодировки
Я имею в виду это: "Как определить в методе printChar что в него передан кирилический символ?"
так пример кода дали как посмотреть коды букв. даже не зная кодировки уже можно сделать по этим данным
а то что кириллица или латиница неважно. все равно вернется код символа. просто он будет в какой то другой части таблицы используемой кодировки
Я понимаю это. Смотрите в метод прилетает символ "W" он подходит под условие &BasicFont[c-32][i]). Но если туда прилетает кирилический символ "Ы", а прилетать будет только первый байт закодированного 2 байтами символа в отличии от латинских. Вот тут-то мне нужно понять что "ага... это не латиница, сместиться надо на +1 байт и посмотреть что там за число" Ок.. там 171... Производим вычисления и берем нужный элемент массива. Верно?
ну так поставь условие. если русские буквы это всегда 2байта, а английские 1 байт. сравни просто по размеру . если код символа больше 255 значит это русская буква. отсеиваешь 1 байт и выводишь
я правильно тебя понял?
ну так поставь условие. если русские буквы это всегда 2байта, а английские 1 байт. сравни просто по размеру . если код символа больше 255 значит это русская буква. отсеиваешь 1 байт и выводишь
я правильно тебя понял?
Да, верно. Видимо мне пора спать :) Всем спасибо. Если что, завтра помучаю вас еще ;)