Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 11.08.2017, 16:02  
supercelt
Прописка
 
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
supercelt на пути к лучшему
По умолчанию Строку из UTF-8 в ANSI

Привет! Извиняюсь если эта тема была ранее. Помогите пожалуйста. У меня stm32f405. Работаю с ЖК дисплеем МЭЛТ. Фишка в том, что у него символы стоят в таблице на своём месте, только если использовать кодировку ANSI. Если UTF-8, то все не так например как в winstar. Есть конечно лёгкий путь, но он меня не устраивает. А заключается он в следующем: Я перекодировал файл в кодировку ANSI, далее в Keil выставил кодировку тоже ANSI. И когда я передаю строку
Код:
lcd2_send_string_xy(0,0, "Я русиш");
на дисплей выводится русский, но в самом редакторе, где кодю, вот это слово - Я русиш, оно каракулями. Я перевожу кеил в cp1251 и слово становится нормально видно, но на дисплее оно кривое. То есть я к тому что можно оставить и ANSI, но тогда я не буду видеть какой русский текст я пишу в редакторе. А так то всегда у меня в кеиле стоит utf-8. Так вот вопрос.... есть ли рабочая функция, или библа, которая хорошо переведёт символы строки char из UTF-8 в ANSI?
Реклама:
supercelt вне форума  
Непрочитано 11.08.2017, 17:39  
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,258
Сказал спасибо: 11,170
Сказали Спасибо 3,859 раз(а) в 2,929 сообщении(ях)
mike-y-k на пути к лучшему
По умолчанию Re: Строку из UTF-8 в ANSI

Кодировка там в первых 128 символах таки ASCII, а вот что МЭЛТ использует для второй половины таблицы? KOI-8, CP866, EBCDIC? Это уже расширения ASCII на 8бит.
Алгоритмов море - но они универсальные (для полной UTF-8 ).
Берёте табличку для нужного множества из UTF-8 и за вечер пишете и отлаживаете сами.
Там все очень прозрачно. Возвращать два значения - символ и смещение к следующему значению в буфере - оно зависит от символа.
Описание кодирования даже в wiki нормально расписано.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…

Последний раз редактировалось mike-y-k; 14.08.2017 в 01:20.
mike-y-k вне форума  
Непрочитано 12.08.2017, 02:01  
supercelt
Прописка
 
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
supercelt на пути к лучшему
По умолчанию Re: Строку из UTF-8 в ANSI

Вобщем не знаю правильно ли так делать, но я выяснил, что надо просто от кода символа отнять число 848 и получится адрес который мне нужен в таблице дисплея. То есть 848 это то смещение. Но столкнулся вот с чем теперь.
Вот функцией вывода строки на экран
Код:
void lcd2_send_string_xy(uint8_t x, uint8_t y, wchar_t *str){
	uint8_t st = 0, i = 0;
	uint8_t symbol = 0;
	TIM13-›CR1 &= ~TIM_CR1_CEN; //
	st = x + 0x80;
	if(y == 1){
		st += 0x40;
	}
	lcd2_send_command(st);
	delay_us(40);
	while(str[i] != 0){
		if(str[i] ›= 0xC0){
			symbol = (str[i] - 0x350) & 0xFF;
			lcd2_send_data(symbol);
		}else{
			lcd2_send_data(str[i]);
	  }
		delay_ns(); //!!!!
		i++;
	}
}
wchar_t я применил потому что символ русский у меня в utf-8 (2 байта).
А вот сам вывод:
Код:
wchar_t r_str[] = {0x042F};
int main(void){
	SystemInit();
	SystemCoreClockUpdate();
	__enable_irq();	
	lcd2_ini();
	lcd2_send_string_xy(0,0, r_str);
	while(1){
		__NOP();
	}
}
На экране всё отлично, но я бы хотел в редакторе писать вот так:
Код:
lcd2_send_string_xy(0,0, "Я");
А кеил ругается, если я так поставлю, он считает, что там всё-равно должно быть char * (ругается именно на эту строку на символ Я)
supercelt вне форума  
Непрочитано 12.08.2017, 02:48  
Hives
Гражданин KAZUS.RU
 
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
Hives на пути к лучшему
По умолчанию Re: Строку из UTF-8 в ANSI

нда, таких эпичных КОСТЫЛЕЙ я еще не видал...
PS для тех кто в танке - строки типа wchar_t начинаются с "L": L"Я"

Последний раз редактировалось Hives; 12.08.2017 в 02:55.
Hives вне форума  
Сказали "Спасибо" Hives
mike-y-k (12.08.2017)
Непрочитано 12.08.2017, 04:26  
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,258
Сказал спасибо: 11,170
Сказали Спасибо 3,859 раз(а) в 2,929 сообщении(ях)
mike-y-k на пути к лучшему
По умолчанию Re: Строку из UTF-8 в ANSI

supercelt, если завтра у Вас попадётся текст на фарси, китайском или иврите, то весь ваш алгоритм накроется тазиком.
В той же wiki вполне разжевана кодировка символов в UTF-8.
Надо проверять на допустимые символы, преобразовывать их в нужное, а для остальных (кроме первых 128 ) выводить тот же "?".
А в последнем примере и не получится - константа "не той системы"(c)

Нужна своя функция на место функции вывода на экран с проверкой и перекодировкой всего переданного буфера.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…

Последний раз редактировалось mike-y-k; 12.08.2017 в 04:30.
mike-y-k вне форума  
Непрочитано 12.08.2017, 08:11  
Hives
Гражданин KAZUS.RU
 
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
Hives на пути к лучшему
По умолчанию Re: Строку из UTF-8 в ANSI

я не об этом, ну да ладно. вообще я считаю что ничему кроме 1251 не место в контроллерах: вполне достаточно 2 языков - русского для себя и аглицкого - для всех прочих. в итоге - расход памяти меньше, код быстрее, проще и стабильнее, и никаких глюков с конвертацией.
PS а китаезы и индусы пусть мучаются со своими каракулями.
Hives вне форума  
Непрочитано 12.08.2017, 11:52  
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,258
Сказал спасибо: 11,170
Сказали Спасибо 3,859 раз(а) в 2,929 сообщении(ях)
mike-y-k на пути к лучшему
По умолчанию Re: Строку из UTF-8 в ANSI

Hives, слишком категорично и явно не совпадает с кочкой зрения производителей. Вопрос ТС из той же серии. Тут легче выучить несколько английских слов и не парить себе мозг лишними проблемами. Как плюс - на экран ещё и больше данных влезет .
Кстати и 866, и KOI-8, тут явно универсальнее будут - на msmd свет клином совсем не сошёлся .
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
mike-y-k вне форума  
Непрочитано 12.08.2017, 20:36  
supercelt
Прописка
 
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
supercelt на пути к лучшему
По умолчанию Re: Строку из UTF-8 в ANSI

Hives, может оно и так, но как я уже говорил, я сделал кодировку ср1251. В редакторе все видно, а на ЖК каракули. Переделал кодировку на ANSI, в итоге на ЖК всё норм, а что печатаю на русском в редакторе - не вижу.
supercelt вне форума  
Непрочитано 12.08.2017, 21:13  
NewWriter
Заблокирован
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: Строку из UTF-8 в ANSI

А что для вас важнее - видеть напечатанное в редакторе (ваапще не проблема приписать //коммент или /*коммент*/) или нагрузить МК дополнительными вычислениями?
NewWriter вне форума  
Непрочитано 12.08.2017, 22:05  
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,258
Сказал спасибо: 11,170
Сказали Спасибо 3,859 раз(а) в 2,929 сообщении(ях)
mike-y-k на пути к лучшему
По умолчанию Re: Строку из UTF-8 в ANSI

supercelt, а сообщения вынести в .h и править их в другом редакторе с нужной кодировкой? Наверняка они не каждый даже день правятся в итоге…
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
mike-y-k вне форума  
 

Закладки
Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Преобразование числа в строку STM32 Cocox sanstan Embedd С 16 05.11.2016 17:58
Как распарсить строку - помогите индюк Embedd С 24 30.10.2016 12:10
Помогите принять строку по usart от АТ модема kasper37 Микроконтроллеры, АЦП, память и т.д 10 03.01.2009 16:21
Как сделать бегущую строку? DSerge Микроконтроллеры, АЦП, память и т.д 12 26.10.2008 10:18
как записать строку в массив? dimonbest Микроконтроллеры, АЦП, память и т.д 8 27.02.2008 12:18


Часовой пояс GMT +4, время: 17:39.


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