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

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

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

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

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

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


 
Опции темы

Строку из UTF-8 в ANSI

Непрочитано 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
Адрес: Москва СЗАО/МО
Сообщений: 12,287
Сказал спасибо: 11,861
Сказали Спасибо 4,159 раз(а) в 3,177 сообщении(ях)
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.RUN
 
Регистрация: 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
Адрес: Москва СЗАО/МО
Сообщений: 12,287
Сказал спасибо: 11,861
Сказали Спасибо 4,159 раз(а) в 3,177 сообщении(ях)
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.RUN
 
Регистрация: 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
Адрес: Москва СЗАО/МО
Сообщений: 12,287
Сказал спасибо: 11,861
Сказали Спасибо 4,159 раз(а) в 3,177 сообщении(ях)
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
Почётный гражданин KAZUS.RUN
 
Аватар для NewWriter
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,481
Сказал спасибо: 396
Сказали Спасибо 2,222 раз(а) в 1,317 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: Строку из UTF-8 в ANSI

А что для вас важнее - видеть напечатанное в редакторе (ваапще не проблема приписать //коммент или /*коммент*/) или нагрузить МК дополнительными вычислениями?
NewWriter вне форума  
Непрочитано 12.08.2017, 22:05  
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО/МО
Сообщений: 12,287
Сказал спасибо: 11,861
Сказали Спасибо 4,159 раз(а) в 3,177 сообщении(ях)
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, время: 16:54.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.