Size: a a a

2020 April 10

AB

Artöm Bakri Al-Sarmini in pro.cxx
Yuri Hudobin
...Но не поместится в char32_t, если эмодзи с модификатором пола или расы.
Это разве не графемный кластер (или как это называется)?
источник

AB

Artöm Bakri Al-Sarmini in pro.cxx
Короче, желаю автору определится, что такое символ и зачем ему они
источник

YH

Yuri Hudobin in pro.cxx
Возможно. Поэтому Егору все же следует читать из файла просто байтики.
источник

DV

Dmitrij V in pro.cxx
Привет. А как правильно прочитать файл в utf8 посимвольно в чистом c?
Егор, дерзай:

inline std::size_t utf8len(char c) noexcept {
if (!(c & 0x80)) return 1;
 if (c & 0x40) {
   if (c & 0x20) {
     if (c & 0x10) {
       if (c & 0x08) {
         if (c & 0x04) { return 6; }
         return 5;
       } return 4;
     } return 3;
   } return 2;
 } return 1;
}
источник

PK

Pavel Kazakov in pro.cxx
Так я посимвольно хочу
Не путай глифы и графемные кластеры с код поинтами и байтами
источник

PK

Pavel Kazakov in pro.cxx
Разве? У меня помещается
Они разные есть
источник

PK

Pavel Kazakov in pro.cxx
Большинство не поместится (на винде)
источник

A

Alex in pro.cxx
Dmitrij V
Егор, дерзай:

inline std::size_t utf8len(char c) noexcept {
if (!(c & 0x80)) return 1;
 if (c & 0x40) {
   if (c & 0x20) {
     if (c & 0x10) {
       if (c & 0x08) {
         if (c & 0x04) { return 6; }
         return 5;
       } return 4;
     } return 3;
   } return 2;
 } return 1;
}
это 100% правильный код????
источник

DV

Dmitrij V in pro.cxx
Alex
это 100% правильный код????
ну у меня работает, есть сомнения ?
источник

A

Alex in pro.cxx
у меня откуда-то давно выдранный код на С, который определяет длину символа в байтах по таблице + if, и это весьма замедляет работу со строками
источник

ДЛ

Дмитрий ⬡ Лапшин in pro.cxx
Так я посимвольно хочу
Крайне рекомендую не хотеть читать юникод посимвольно. Почитай про графемы, единицы кодировки и code points.
источник

ДЛ

Дмитрий ⬡ Лапшин in pro.cxx
Dmitrij V
Егор, дерзай:

inline std::size_t utf8len(char c) noexcept {
if (!(c & 0x80)) return 1;
 if (c & 0x40) {
   if (c & 0x20) {
     if (c & 0x10) {
       if (c & 0x08) {
         if (c & 0x04) { return 6; }
         return 5;
       } return 4;
     } return 3;
   } return 2;
 } return 1;
}
UTF8 не бывает длиннее 4.
источник

in pro.cxx
Дмитрий ⬡ Лапшин
Крайне рекомендую не хотеть читать юникод посимвольно. Почитай про графемы, единицы кодировки и code points.
Да господи, читал я про все это
источник

PK

Pavel Kazakov in pro.cxx
Alex
у меня откуда-то давно выдранный код на С, который определяет длину символа в байтах по таблице + if, и это весьма замедляет работу со строками
А что такое символ? :) Decomposed UTF, как в OSX, например, в это определение вписывается?
источник

in pro.cxx
Короче, перефразирую вопрос
источник

A

Alex in pro.cxx
не знаю таких тонкостей, это не важно, если результат консистентный
источник

m

magras in pro.cxx
Dmitrij V
ну у меня работает, есть сомнения ?
Вы для символа из середины последовательности возвращаете 1.

Кроме того, я бы избавился от лестницы инвертировав условия.
источник

DV

Dmitrij V in pro.cxx
magras
Вы для символа из середины последовательности возвращаете 1.

Кроме того, я бы избавился от лестницы инвертировав условия.
Ок, можете кинуть сюда, если знаете, чего уж таить ;)
источник

A

Alex in pro.cxx
magras
Вы для символа из середины последовательности возвращаете 1.

Кроме того, я бы избавился от лестницы инвертировав условия.
думаю, вызывать на байте из середины последовательности - ошибка.
Лично мне нужен код, который максимально быстро по первому байту utf8 кода скажет длину этой последовательности, чтобы я мог прыгнуть на следующий символ.
источник

A

Alex in pro.cxx
Хотя, я вас обманул, у меня тоже код простой, без таблиц
источник