Главная Настройка Mobile Контакты NSFW Каталог Пожертвования Купить пасскод Pics Adult Pics API Архив Реквест доски Каталог стикеров Реклама
Доски


[Ответить в тред] Ответить в тред

Check this out!


<<
[Назад][Обновить тред][Вниз][Каталог] [ Автообновление ] 52 | 6 | 17

НЕНАВИСТИ К УБОГОМУ ЮНИКОДУ TPED Ананасы, я вот Аноним 30/04/18 Пнд 13:25:42  1182002  
144502282612543[...].jpg (201Кб, 758x600)
НЕНАВИСТИ К УБОГОМУ ЮНИКОДУ TPED
Ананасы, я вот не пойму. Зачем UTF-8 так запутали? Он логичен, не спорю, но почему длина статична? Вместо единственного бита-маркера в хвостовом октете сжирается половина старшего. Почему расширение диапозона происходит на таком узком интервале? Сколько раз веб крутанётся на хую, если со временем число известных человечеству символов преодолеет миллион? Кто додумался поставить лимит в 4 байта?
Подозреваю, древние римляне в целях латинизации захваченных земель завещали искоренить все кодировки, кроме ASCII. Поэтому алгоритм UTF-8 так тщательно купает в говне многобайтовые символы.
Смотрим плюсы: дохуя кодирует, совместима с ASCII, отсутствует маркер последовательности, идентификацруется в любом направлении.
Задача простая. Однако. Тот крайний, кому поручили сварганить алгоритм кодирования, опять просрал время и за час до дедлайна собрал все костыли других многобайтовых кодировок.
А мог сделать так:
0 - ASCII, один байт.
10
- старшие октеты многобайта, их число не ограничено.
11
* - хвостовой октет.
Правый маркер - хвост, левый маркер - хвост предыдущего символа, либо ASCII. Логично, просто, соблюдены все требования. В 2 байта умещается 4 тыщи, в 4 байта - 16 лямов. Напомню, UTF-8 способен только на один лям.
ДИСКАСС.
Аноним 30/04/18 Пнд 13:28:31  1182003
>>1182002 (OP)
Разметка епт
10+++++++ - старшие
11+++++++ - хвост
Аноним 30/04/18 Пнд 16:26:36  1182087
>>1182002 (OP)
>Кто додумался поставить лимит в 4 байта?
4 байта хватит всем!
Аноним 30/04/18 Пнд 17:38:56  1182133
>>1182002 (OP)
>Сколько раз веб крутанётся на хую, если со временем число известных человечеству символов преодолеет миллион?
А нехуй было эмоджи вводить
Аноним # OP  30/04/18 Пнд 17:41:20  1182136
>>1182133
Как будто я виноват. Прилетят планетяне со своими азбуками, куда их пихать?
Аноним 30/04/18 Пнд 18:37:48  1182159
>>1182136
>куда их пихать?
Инопланетян? В багажник.
Аноним 30/04/18 Пнд 19:00:19  1182161
UTF-8 лишь подмножество юникода.
Аноним 01/05/18 Втр 07:38:28  1182417
>>1182002 (OP)
Вероятно чтобы сделать предсказуемой аллокацию. Читая первый октет ты уже знаешь сколько байт занимает символ. Более того, нельзя заебенить символ занимающий более 32 бит, с твоим вариантом будут всякие buffer overflow.
Аноним 01/05/18 Втр 12:04:21  1182478
>>1182417
Не будет там никакого буфер овервло, каждый новый байт тупо сдвигается влево и добавляется к одному и тому же 32-битному числу.

2оп: все верно, вся наша история это криворукие дебилы, которые далее сиюминутного практического применения помыслить не в состоянии. Утф с наркоманским кодированием. Жысон с кавычками, без комментов и с ебучей запятой. Сгмл-производные высеры, приправленные легасями из браузеров. SQL, который не умеет в не-inplace определения. GraphQL, который может все, кроме блять самих графов. И никто, никто сука, нихера не думает и не делает с этим.
Аноним 01/05/18 Втр 12:08:15  1182481
>>1182417
> уже знаешь сколько байт занимает символ
Смысл? Если бы он стоял первым октетом, давал бы выигрыш. Но он стоит уже вторым, а минимальна длина - один.
Аноним 01/05/18 Втр 12:10:02  1182482
>>1182002 (OP)
>Кто додумался поставить лимит в 4 байта?
Лол. В схеме кодирования UTF-8 — лимит 6 байт. А 4 байта решили считать максимальной валидной последовательностью из-за того, что этого достаточно для кодирования текущего стандарта юникода.
Аноним 01/05/18 Втр 12:12:00  1182484
>>1182478
> никто не делает
Все привыкли юзать костыли, писать костыли, исправлять костыли костылями, костылять костыли для костылей. Говнокод проще и быстрее, главное, что работает.
© Вовка
Аноним 01/05/18 Втр 12:14:20  1182486
image.png (2Кб, 97x182)
>>1182482
>В схеме кодирования UTF-8 — лимит 6 байт.
Соврал, 7 байт.
6 байт использовалось в UTF-8 до искусственного ограничения в 4 байта.
Аноним 01/05/18 Втр 12:17:59  1182488
>>1182478
>все верно, вся наша история это криворукие дебилы, которые далее сиюминутного практического применения помыслить не в состоянии. Утф с наркоманским кодированием.
utf-8 — нормальное кодирование.
А вот UTF-16 во всяких Windows и java это именно что дерьмо, которое было создано для сиюминутного практического применения: вау, двух байт хватит всем, давайте ограничимся двумя байтами и побыстрее продадим наш высер с шильдиком "unicode enabled".
Аноним 01/05/18 Втр 12:24:59  1182491
>>1182488
Всякие японские кодировки изначально были 16-битные. У толстых букв и впоследствии уникода оттуда ноги и растут, iirc. Но для уникода дерьмо, да, тут спорить не с чем. В итоге каждая программа на винде и жабе текст читает в utf-8, конвертирует в utf-16, мутит-хуютит и снова конвертирует в utf-8, чтобы на диск/в сокет отправить. Долбоебизм сравнимый с майнингом.
Аноним 01/05/18 Втр 12:35:14  1182495
>>1182002 (OP)
Prefix code: The first byte indicates the number of bytes in the sequence. Reading from a stream can instantaneously decode each individual fully received sequence, without first having to wait for either the first byte of a next sequence or an end-of-stream indication. The length of multi-byte sequences is easily determined by humans as it is simply the number of high-order 1s in the leading byte. An incorrect character will not be decoded if a stream ends mid-sequence.
Self-synchronization: The leading bytes and the continuation bytes do not share values (continuation bytes start with 10 while single bytes start with 0 and longer lead bytes start with 11). This means a search will not accidentally find the sequence for one character starting in the middle of another character. It also means the start of a character can be found from a random position by backing up at most 3 bytes to find the leading byte. An incorrect character will not be decoded if a stream starts mid-sequence, and a shorter sequence will never appear inside a longer one.
Sorting order: The chosen values of the leading bytes and the fact that the continuation bytes have the high-order bits first means that a list of UTF-8 strings can be sorted in code point order by sorting the corresponding byte sequences

Маняврируй
Аноним 01/05/18 Втр 12:45:13  1182502
>>1182495
Манявыкладки фантазера-проектировщика (или вообще подогнали rationale под то, что сотворили). Поточный декодер можно так написать, что он будет жрать октеты опа до границы буфера, а если не хватило, ну чтож, хватит в следующий раз, частичный поинт никуда не делся.
>instantaneously decode
Чушь ебаная, у тебя либо хватает октетов, либо нет. Нет никакой разницы, сразу ты это узнал или по ходу дела.
>self-sync, sort-order
Сохраняется.

Давай скопипасть еще умных английских слов.
Аноним 01/05/18 Втр 12:48:38  1182505
>>1182495
>>1182502
Я кстати допустил одну ошибку, либо находишь, либо нахуй из треда, ебаная макака.
Аноним 01/05/18 Втр 12:48:39  1182506
>>1182002 (OP)
> Он логичен, не спорю, но почему длина статична? Вместо единственного бита-маркера в хвостовом октете сжирается половина старшего.
А как ты собрался детектить потерянные байты?
> Сколько раз веб крутанётся на хую, если со временем число известных человечеству символов преодолеет миллион?

Ни сколько. utf-8 кодирует до 2³¹ > 2 млрд. символов.

Аноним 01/05/18 Втр 12:52:24  1182510
>>1182506
Нахуй их детектить, ты че, детектив?
>2³¹ > 2 млрд
Уже нет, лол
Аноним 01/05/18 Втр 12:52:54  1182511
c847f6e0275b736[...].jpg (44Кб, 640x583)
>>1182505
>либо находишь, либо нахуй из треда, ебаная макака.
Аноним 01/05/18 Втр 12:57:26  1182512
Короче, оп, раз этот пидор бездарно слился, палю наш проеб.
Твоя кодировка не будет сортироваться так же, как если бы ты все представил 32-битными символами. В утф-8 чем больше код, тем больше этих единиц в начале, соответственно символы возрастают как по значению, так и по закодированной последовательности. У тебя такого нет, и сортировать строки без декодирования не получится.
Аноним 01/05/18 Втр 13:13:51  1182523
>>1182502
Нахуй пшел, школнег
Аноним 01/05/18 Втр 13:15:37  1182526
>>1182506
>А как ты собрался детектить потерянные байты?
А он не собрался, этой жабамакаке похуй и на границы символов тоже, мамка же всегда оперативки докупит
Аноним 01/05/18 Втр 13:17:44  1182527
152291725416984[...].jpg (106Кб, 605x403)
Трхедик заполнен осликами
Аноним 02/05/18 Срд 05:39:49  1182945
>>1182488
Что в винде, что в джаве, два байта на символ зародилось в 1988-1990, utf-8 же только в 1993 был представлен
>>1182491
utf-8 удобен только тем, что восьмибитный ascii поддерживается из коробки и тем, что в куче сценариев он занимает минимум места (но не во всех). Во всех остальных сценариях он сосет с проглотом, потому что невозможно нет произвольного доступа к символам строки из-за переменной длины, в итоге все стандартные операции работают не за O(1) а за O(N)
Аноним 02/05/18 Срд 06:21:52  1182951
>>1182945
>нет произвольного доступа к символам строки
А зачем он нужен?
Аноним 02/05/18 Срд 06:23:50  1182952
>>1182478
>Жысон с кавычками, без комментов
И без ассемблерных вставок. Пиздец.
Аноним 02/05/18 Срд 19:30:20  1183252
>>1182002 (OP)
>Кто додумался поставить лимит в 4 байта?
ем 16 миллионов символов мало, ну охуеть, двачеры, съебываемся тут реальные дядьки оказывается сидят, не то что мы
пиздец, что за капча нынче пошла
Аноним 02/05/18 Срд 19:52:52  1183262
>>1183252
>съебываемся тут реальные дядьки оказывается сидят
Каникулы
Аноним 02/05/18 Срд 19:59:15  1183266
>>1182951
>все стандартные операции работают не за O(1) а за O(N)
>А зачем он нужен?
Вы тут с фронтендов?
Аноним 02/05/18 Срд 20:00:42  1183267
>>1183262
Джвачую, ОП тупой школопидораха
Аноним 02/05/18 Срд 20:32:11  1183282
>>1182161
Юникод - это таблица символов, UTF-8 - это кодировка, то есть как эти символы представляются в памяти компьютера. Откуда ты такой идиот вылез?

>UTF-8
>подмножество юникода
Скотина тупая, пиздец...
Аноним 02/05/18 Срд 20:58:11  1183295
>>1183252
>>Кто додумался поставить лимит в 4 байта?
>ем 16 миллионов символов мало
В UTF-8 4 байта кодируют 21 бит.
Аноним 02/05/18 Срд 21:00:47  1183298
>>1183266
> все стандартные операции работают не за O(1) а за O(N)
> из-за отсутствия произвольного доступа

Ну-ка, довен, расскажи, как тебе произвольный доступ в, например, UTF-32, позволит конкатенировать строки за O(1) вместо O(N)
Аноним 02/05/18 Срд 21:33:02  1183314
>>1183282
Твой дегенеративный вспук никак не противоречит мной сказанному, ебло тупорылое, сдристни нахуй отсюда чушкарь
Аноним 02/05/18 Срд 21:35:14  1183316
>>1183314
Алсо, ты ещё и сказал хуйню, т.к. если уж придираться к словам по максимуму, то юникод - не таблица, а стандарт кодирования. Юникод != таблица символов Юникода, это разные понятия. Ещё разок псыкнул тебе не еблинский.
Аноним 02/05/18 Срд 21:35:43  1183318
>>1183316
---> >>1183282
Аноним 03/05/18 Чтв 02:02:46  1183493
socialism.jpg (186Кб, 736x567)
>>1182136
Не прилетят — Космос молчит. Мы одни здесь.
Аноним 03/05/18 Чтв 04:35:49  1183509
>>1183298
Ты мне сначала длину строки в UTF-8 найди за O(1)
пок-пок введем дополнительное поле для длины, потом сделаем replace(char,char) и соснем с реаллоцированием даже у изменяемых строк.
С индексированием что substring, что concatenate не требуют сканирования строки, поэтому можно просто memcpy, который почти что O(1)ибо бесконечность недостижима, а множитель настолько мал, что выходи o(сканирование)
Аноним 03/05/18 Чтв 05:27:55  1183513
Morpheus.jpg (19Кб, 500x303)
>>1183509
Что если я скажу тебе, что самые часто применяемые операции со строками это сравнение associative arrays и поиск вхождений, и из-за большей плотности записи UTF-8 всегда выигрывает у UTF-32, банально меньше байт нужно перемолоть.
Аноним 03/05/18 Чтв 06:36:01  1183515
>>1182506
>А как ты собрался детектить потерянные байты?
Где ты потерянные байты детектить собрался? В протоколах в которых и так контрольная сумма передается вместе с информацией?

>>1182526
>мамка же всегда оперативки докупит
Про сжатие кэша не слышал?
Аноним 03/05/18 Чтв 07:11:00  1183516
>>1183509
Сначала:
> ТЫ ТУТ С ФРОНТЕНДА? ВСЕ СТАНДАРТНЫЕ ОПЕРАЦИИ РАБОТАЮТ ЗА O(N) ВМЕСТО O(1) ИЗ-ЗА ОТСУТСТВИЯ ПРОИЗВОЛЬНОГО ДОСТУПА!

Теперь:
> ЭТИ СТАНДАРТНЫЕ ОПЕРАЦИИ НЕ ЗАВИСЯТ ОТ ПРОИЗВОЛЬНОГО ДОСТУПА!

>Ты мне сначала длину строки в UTF-8 найди за O(1)

Принеси real world задачу, где это нужно. Произвольный доступ и поиск длины строк это задачи уровня laba1.
Аноним 03/05/18 Чтв 07:18:54  1183517
>>1183516
Регексы и с небольшой натяжкой парсинг грамматик там вероятно можно как extended ASCII обрабатывать.
Аноним 03/05/18 Чтв 08:33:50  1183525
>>1183513
Штоу?
Такс, если не наркоманить (строки на линкованых листах и словарях), то реализация строки в памяти - это массив fixed-size элементов-символов (байт для ascii, два байта для utf16, не видел в природе utf-32 и неигнорирование суррогатных пар из коробки, окромя специальных классов для текстовой обработки). Где-то тут рядом торчит длина этого массива (как часть массива в C#,Java не вспоминаем про compact strings, либо перед байтами данных в памяти аки BSTR, zero-terminated strings поминаем лихим словом и не утекаем вместе с памятью).
Самые популярные операции:
1)Длина строки. Просто берем сохраненный размер - O(1). В случае utf-8 же надо прочитать всю строку и постоянно проверять является ли текущий байт символом либо куском символа, нааккумулировать количество символов - итого O(N)
2)Взятие символа по индексу. Читаем arr +(N-1) за O(1) вместо сканирования первых N-1 символов
Кроме большой сложности, вышеперечисленные операции сильно страдают с utf-8 из-за misaligned reading.
Далее же идут операции, которые вышеперечисленные используют.
3)Сравнение - очевидно если требуется прочитать O(N) в любом случае, то ниже чем O(N) не получишь. И это даже для тупенького ординального, с культурно-специфичным нужно еще проводить трансформации к каноничным формам - так что тут utf-8 vs fixed size не роляет
4)Подстрока - с позиции n взять m символов - memcpy(
target,arr +n,msizeof(wchar_t)), не более чем O(m) - а в реальных условиях вполне себе o(m) - то бишь O(1). С UTF-8 надо просканировать все строку, чтобы понять где n позиция и где m символов кончаютсяЭкзотика с возвратом ссылки на старый массив/copy-on-write за O(1) выпилена и из Java, и из GCC
5)Trim/Ltrim/Rtrim/Contains/StartsWith/EndsWith/ToUpper/ToLower/Split - как и со сравнением, тут нужно читать - поэтому меньше чем за O(N) не выйдет
6)Concat - строго говоря работает напрямую с байтайми, memcpy в один массив, O(noOfElements) что у utf-8, что у fixed size
7)Replace - нужно читать, поэтому O(N), если строки неизменяемые - то результат нужно все равно аллоцировать. Если же изменяемые, то с fixed size все просто, а с utf-8 все равно нужно переаллоцировать ибо 3 байта вместо 1 хуй вставишь.
Кстати, никто не говорил про UTF-32, что в винде, что в джаве, что в шарпе используют UTF-16, а суррогатные пары учитывают только во вспомогательных классах, строки же втупую считают суррогатную пару за два символа и нет, это не UCS-2, а в некоторых ситуациях UTF-8 проигрывает UTF-16 в размере.
>>1183516
Если, ты собрался реализовывать рантайм/стандартную библиотеку как задачу уровня laba1, то тебе в npm пора свои наработки выкладывать, аки leftpad
На всякий случай, еще раз для дебичей, переменная длина символов в utf-8 лишает произвольного доступа к символам, и от этого большая часть операций, которые работали за O(1), работают за O(N). Это, блядь, нихуя не то же самое, что произвольный доступ превращает любой алгоритм за O(N) в алгоритм за O(1)
Аноним 03/05/18 Чтв 09:19:26  1183535
>>1183525
А почему ты думаешь что там голый byte/word array везде? Если строки иммутабельные, можно же рядом сложить длину строки, небольшой индекс по позициям символов (например для каждого десятого). Вот уже O(1) для длины строки, O(log N) для подстроки.

>Replace
>с fixed size все просто
А чё это просто? Ну символ на символ заменить ещё понятно. Но так-то можно же и строки разной длины друг на друга заменять. Будет такой же realloc/memmove.
Аноним 03/05/18 Чтв 09:30:05  1183537
>>1183525
>1)Длина строки. Просто берем сохраненный размер - O(1). В случае utf-8 же надо прочитать всю строку и постоянно проверять является ли текущий байт символом либо куском символа, нааккумулировать количество символов - итого O(N)
>2)Взятие символа по индексу. Читаем arr +(N-1) за O(1) вместо сканирования первых N-1 символов
>Кроме большой сложности, вышеперечисленные операции сильно страдают с utf-8 из-за misaligned reading.
>Далее же идут операции, которые вышеперечисленные используют.
>4)Подстрока - с позиции n взять m символов - memcpy(target,arr +n,msizeof(wchar_t)), не более чем O(m) - а в реальных условиях вполне себе o(m) - то бишь O(1). С UTF-8 надо просканировать все строку, чтобы понять где n позиция и где m символов кончаютсяЭкзотика с возвратом ссылки на старый массив/copy-on-write за O(1) выпилена и из Java, и из GCC

А какие, собственно, юз кейсы у голых memcpy, взятии символа по индексу и нахождении длины строки? Тебе же по любому нужно найти где именно у тебя подстрока находится, можешь сразу индексы в переменные скопировать и потом в тот же memcpy передать хоть для utf-8, хоть для utf-16.
Аноним 03/05/18 Чтв 10:42:51  1183567
>>1183525
>1)Длина строки.
Если тебе надо сохранить в базу данных с полем фиксированной длины, то тебе достаточно знать, сколько там байтов.
Если число видимых символов (grapheme clusters), то надо сканировать всю строку в том числе и в utf-32.
"Длина строки" в смысле code unit/code point практического смысла не имеет.

> 2)Взятие символа по индексу.
Задание из laba1. Практической такой задачи не встречается. В языках со встроенной поддержкой юникода (Swift, например) работают с grapheme clusters.

> операции сильно страдают с utf-8 из-за misaligned reading
Для байтов нет misaligned reading. Байт по любому адресу "выровнен".

> 4)Подстрока - с позиции n взять m символов
Опять задание из labaX.
Аноним 03/05/18 Чтв 16:52:48  1183743
>>1183535
А приведи пример где не голый byte/char array? В стандартной библиотеке/реализации рантайма, не в пет-проджекте. В C# - array двухбайтовых чаров, в Java - фккфн двухбайтовых чаров недавно завезли compact strings - строка может быть не из utf-16 char, а Latin1 byte -потому там byte array все сложно
В плюсах string, std::string - массив char, std::wstring - массив wchar_t, из-за гибкости определения char завезли еще std::u16string - массив char16_t, и std::u32string - массив char32_t
В Питоне было string - массив 1-байтовых char и unicode - массив 2-байтовых char, стал string - массив в зависимости от режима 1-байтовых,2-байтовых или же 4-байтовых символов.
В Javascript V8 - массив либо 1-байтовых, либо 2-байтовых символов.
>>1183537
Понимаешь хоть, что такое базовые операции, и что решения юзкейсов опираются именно на них? И если базовые операции не подходят для юзкейса - нужно их реализовать самому? Вот это вот копирование индексов в переменные - именно что своя реализация для substring. Хреновая сложность обычно выражается не в тот что у тебя взятие символа по индексу стало линейным вместо константного, а в том что триграмный поиск стал квадратичным вместо слинейного, или поиск string_similarity стал кубическим вместо квадратичного
>>1183567
>laba1,labaX
> В языках со встроенной поддержкой юникода (Swift, например) работают с grapheme clusters.
А, ты из этих пробитых, у которых substring даже не было несколько лет. И ось уходила в гости к Джобсу от нескольких символов девангари.
>Для байтов нет misaligned reading
UTF-8 не однобайтовая, если тебе для чтения нескольких байтов нужно прочитать каждый байт по отдельности - то ты получаешь ситуацию даже хуже чем misaligned reading. С UTF-8 как - можно понять длину символа по первому байту, а потом можно прочитать его целиком - но на может уйти как нормальное чтение, так и невыровненное, если символ пересек выравнивание.
Аноним 03/05/18 Чтв 17:09:33  1183754
>>1183743
>не голый byte/char array
Я не это имел ввиду, не заменить array, а рядом с ним структуры держать. Но тащемта в хаскеле строка это связный список например.
Аноним 03/05/18 Чтв 18:39:16  1183788
>>1183754
>Но тащемта в хаскеле строка это связный список например
Которым никто в реальной жизни не пользуется. Есть тип Data.Text (аж две штуки) + экстеншн OverloadedStrings.
Аноним 03/05/18 Чтв 18:55:28  1183796
>>1183515
> В протоколах в которых и так контрольная сумма передается вместе с информацией?
Это в каких же?
Аноним 03/05/18 Чтв 19:43:05  1183834
>>1183754
В теории то можно, но по факту никто не пользуется. В функциональщине неэффективные структуры вполне живут, за счет возможности доказать отсутствие говеных эффектов и литров пота, которые выделяют программисты GHC
Вся телега с compacted strings в HotSpot JVM была как раз про то, как уменьшить нагрузку на память - если только символы Latin1 то хранить в однобайтной кодировке. Если рядом с массивом держать еще и дополнительные структуры держать, то нагрузка только увеличится. Кстати, UTF-8 на самом то деле выигрывает в объеме только на символах из Latin1 и близлежайших, чтобы покрыть Basic Multilingual Plane из Unicode в UTF-16 хватает 2 байт, в UTF-8 же надо 3 байта. Японцы поэтому не особо рады UTF-8 лол, это ж типичный white privilege


Топ тредов
Избранное