Easyelectronics.ru

Электроника для всех
Текущее время: 20 сен 2020, 20:27

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 31 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: UTF8 и микроконтроллеры
СообщениеДобавлено: 14 мар 2019, 01:36 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 705
cheblin писал(а):
не ту функцию скопировал. нужно было utf8proc_iterate брать, преобразование из UTF8

схематично идея в следующем
Изображение

Я вас понял, но по моему скромному мнению, это не совсем корректно. Так как 0 после битового поля очень важен, то нужно все-таки считать биты. Поясню свою мысль, считаем со старшего бита 0b0 - byte ASCII, 0b10 - вторичный байт UTF-8, 0b110 - мастер байт 2-ух байтовой последовательности и т.д. Нарушение же данного правила должно выдавать ошибку.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UTF8 и микроконтроллеры
СообщениеДобавлено: 14 мар 2019, 07:25 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 3558
Откуда: Китай, Пекин
Цитата:
Так как 0 после битового поля очень важен, то

так оно учитывает - этот ноль... кажися

и кстати да, спасибо что вчитываетесь в код.
с Вами интересно.

_________________
unirail.org


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UTF8 и микроконтроллеры
СообщениеДобавлено: 14 мар 2019, 17:32 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 705
Доброго времени суток !

Предлагаю следующий вариант декодирования. маска со сравнением:
Код:
uint8_t mask = 0x80;
uint8_t cnt = 0;
while(cnt <= 4) {
         if ((b[0] & mask) == (mask << 1)) break;
         mask = (mask >> 1) | 0x80; cnt++;
}
switch (cnt) {
         case 0: // ASCII
                 break;
         case 1: // Error secondary byte UTF-8
                 break;
         case 2: // 2 byte UTF-8
                 break;
         case 3: // 3 byte UTF-8
                 break;
         case 4: // 4 byte UTF-8
                 break;
         default: // error
                break;
}

По желанию можно модифицировать - добавить варианты байт, свитч заменить на массив указателей, в общем прилизать немного код.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UTF8 и микроконтроллеры
СообщениеДобавлено: 14 мар 2019, 18:24 
Старожил

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 3457
Lua, lutf8lib.c
Код:
/*
** Decode one UTF-8 sequence, returning NULL if byte sequence is invalid.
*/
static const char *utf8_decode (const char *o, int *val) {
  static const unsigned int limits[] = {0xFF, 0x7F, 0x7FF, 0xFFFF};
  const unsigned char *s = (const unsigned char *)o;
  unsigned int c = s[0];
  unsigned int res = 0;  /* final result */
  if (c < 0x80)  /* ascii? */
    res = c;
  else {
    int count = 0;  /* to count number of continuation bytes */
    while (c & 0x40) {  /* still have continuation bytes? */
      int cc = s[++count];  /* read next byte */
      if ((cc & 0xC0) != 0x80)  /* not a continuation byte? */
        return NULL;  /* invalid byte sequence */
      res = (res << 6) | (cc & 0x3F);  /* add lower 6 bits from cont. byte */
      c <<= 1;  /* to test next bit */
    }
    res |= ((c & 0x7F) << (count * 5));  /* add first byte */
    if (count > 3 || res > MAXUNICODE || res <= limits[count])
      return NULL;  /* invalid byte sequence */
    s += count;  /* skip continuation bytes read */
  }
  if (val) *val = res;
  return (const char *)s + 1;  /* +1 to include first byte */
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UTF8 и микроконтроллеры
СообщениеДобавлено: 14 мар 2019, 21:10 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 3558
Откуда: Китай, Пекин
годнота!

_________________
unirail.org


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UTF8 и микроконтроллеры
СообщениеДобавлено: 15 мар 2019, 18:03 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 705
Доброго времени суток !
2_pv В приведенном вами коде, нет отлова ошибок. То есть он любой байт у которого 2-ва (и более) старших бита в 1 будет рассматривать как заглавный байт UTF-8, а следующие за ним байты как вторичный UTF-8.
Немного выше я с ТС-ом именно обсуждал то, то нужно убедится, что это действительно UTF-8, из за чего и заморочился со сдвигом маски туда-сюда. Чтоб убедится что это именно непрерывная последовательность бит, заканчивающаяся 0.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 31 ]  На страницу Пред.  1, 2


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB