Vitaliy ◀️TriΔng3l▶️
эмодзи
Так они же до 10ffff
Vitaliy ◀️TriΔng3l▶️
4 байта вместе с первым
Pavel
Так они же до 10ffff
не все вроде
Vitaliy ◀️TriΔng3l▶️
Свыше 10ffff уже невалидные
Vitaliy ◀️TriΔng3l▶️
или валидные? O_O
Aidar
4 байта вместе с первым
Ютф8 до шести байт
Vitaliy ◀️TriΔng3l▶️
Longer encodings are called overlong and are not valid UTF-8 representations of the code point.
Vitaliy ◀️TriΔng3l▶️
а, стоп
Vitaliy ◀️TriΔng3l▶️
это не про то
Vitaliy ◀️TriΔng3l▶️
Но ограничение на 1114112 code points никто не отменял, вроде, и из них занято только чуть больше сотни тысяч
Constantine
UTF-16 непредставимые запретили
Constantine
Ютф8 до шести байт
UTF-8 позволяет записать много невалидных кодпоинтов, да
Vitaliy ◀️TriΔng3l▶️
немного переделал своё говно, убрал возврат символа замены три раза, заменил != || != на == && ==
Constantine
лучше бы ты все-таки списывал с фолли
Constantine
А что там?
Там хитрые планы очень
Vitaliy ◀️TriΔng3l▶️
Да я просто хочу, чтобы конкретно, если символ невалидный, мне выдавало '?'
Vitaliy ◀️TriΔng3l▶️
Причём невалидный исключительно с точки зрения перевода между UTF-8, UTF-16 и UTF-32
Vitaliy ◀️TriΔng3l▶️
На BOM всякие мне пофиг, это уже при чтении файлов надо рассматривать
Vitaliy ◀️TriΔng3l▶️
????
Именно так
Constantine
U+FFFD замечательный символ
Vitaliy ◀️TriΔng3l▶️
U+FFFD замечательный символ
Он 3 байта занимает в UTF-8, нафиг
Vitaliy ◀️TriΔng3l▶️
Я бы за такое руки оторвал
Да мне только для отрисовки
Constantine
Да мне только для отрисовки
а если UTF-8 последовательность для D800 ты мне U+D800 вернешь?
Vitaliy ◀️TriΔng3l▶️
а если UTF-8 последовательность для D800 ты мне U+D800 вернешь?
Вот это я и имею в виду под невалидностью с точки зрения конверсии
Vitaliy ◀️TriΔng3l▶️
Vitaliy ◀️TriΔng3l▶️
а FFFE верну
Constantine
наркоман шоле
Constantine
а если я потом его в UTF16 впишу?
Vitaliy ◀️TriΔng3l▶️
наркоман шоле
Он не мешает
Vitaliy ◀️TriΔng3l▶️
а если я потом его в UTF16 впишу?
Если в начале файла — обработаю
Constantine
Vitaliy ◀️TriΔng3l▶️
Обработаешь как BOM
Да, буду местами менять байты, но это уже в коде чтения файлов
Vitaliy ◀️TriΔng3l▶️
А в строках — пофиг, там считаю, что нативный endian
Constantine
Короче мой тебе совет, твой сосед с неконтроллируемой агрессии очень не любит, когда ему некорректный возврат возращают
Constantine
Если стандарт юникода говорит, что символ U+FFFE запрещен, то ты не должен его возвращать
Vitaliy ◀️TriΔng3l▶️
Vitaliy ◀️TriΔng3l▶️
Но вообще, грузить UTF-16 я вряд ли буду где-либо
Vitaliy ◀️TriΔng3l▶️
Только UTF-8
Vitaliy ◀️TriΔng3l▶️
return ((cp » 1u) != 0x7fffu && (cp & ~((abTextU32) 0x7ffu)) != 0xd800u) ? cp : abText_InvalidSubstitute;
Vitaliy ◀️TriΔng3l▶️
return (cp <= 0x10ffffu && (cp & 0xfffeu) != 0xfffeu) ? cp : abText_InvalidSubstitute;
Vitaliy ◀️TriΔng3l▶️
еееее, говнокод)))
Oleg
/
Anonymous
Когда не шарю в программировании, но хочу изучать
Vladislav
Когда не шарю в программировании, но хочу изучать
Только не пиши никогда такие тернарные операторы
Vitaliy ◀️TriΔng3l▶️
Не ожидал такого различия на MSVC (32-битном) O_O https://godbolt.org/g/6yGwTx
Vitaliy ◀️TriΔng3l▶️
Но Clang и GCC выдали то же самое, только с разными immediates
Columbus
иногда они выглядят даже приятнее, чем обычные ифы
Vitaliy ◀️TriΔng3l▶️
И на ARM тоже сдвиг immediate не был использован, видимо, там 0xd800|(0xd800«16) раскрылось
Vitaliy ◀️TriΔng3l▶️
unsigned int abTextU16_EncodeCP_ValidV3(unsigned int cp) { if ((cp >> 16u) == 0u) { return cp; } unsigned int low = 0xd800u | (cp & 0x3ffu); unsigned int high = 0xd800u | (cp >> 10u); return low | (high << 16u); } abTextU16_EncodeCP_ValidV3(unsigned int): lsrs r3, r0, #16 beq .L14 movs r3, #216 lsls r0, r0, #22 lsrs r0, r0, #22 lsls r3, r3, #8 orrs r3, r0 lsls r0, r3, #16 orrs r0, r3 .L14: bx lr Красотища, ни одного ldr
Vitaliy ◀️TriΔng3l▶️
Вот так и буду делать, по отдельности
Vitaliy ◀️TriΔng3l▶️
mov rax, 57982943232 ; 0000000d800d8000H 64-битный MSVC в той функции, что V2 😱
Vitaliy ◀️TriΔng3l▶️
А вот в V3 уже immediates 16-битные
Vitaliy ◀️TriΔng3l▶️
Вообще, эта функция мне и не нужна
DZ
а на си разве нельзя писать более...красиво?
На Си в Яблоке красиво пишут. Остальные вырвиглаз-стайл. 😁
Vitaliy ◀️TriΔng3l▶️
На Си в Яблоке красиво пишут. Остальные вырвиглаз-стайл. 😁
Есть примеры того, что особенно красиво?
Vitaliy ◀️TriΔng3l▶️
Код Quake тоже красиво выглядит, хоть и там не очень строго со стилем было
B
Ллвм код хорошо выглядит тоже
Vitaliy ◀️TriΔng3l▶️
Линк?
Например https://github.com/id-Software/Quake/blob/master/WinQuake/sv_main.c
DZ
Есть примеры того, что особенно красиво?
Утечки их boot'a в сети выкладывали правда они потом быстро эти ресурсы прикрыли. В сети мож где есть ещё надо поискать.
Vitaliy ◀️TriΔng3l▶️
да ёпт
Vitaliy ◀️TriΔng3l▶️
к d800 прибавляются верхние биты
Vitaliy ◀️TriΔng3l▶️
а к dc00 нижние
Vitaliy ◀️TriΔng3l▶️
ладно, буду ксорить с dc00, а не орить с d800)))
Aidar
ладно, буду ксорить с dc00, а не орить с d800)))
харе ассемблерную кашу вываливать в чат
Vitaliy ◀️TriΔng3l▶️
Vitaliy ◀️TriΔng3l▶️
ой, а этот верхний бит и не всегда будет стоять же
vladislav
ой, а этот верхний бит и не всегда будет стоять же
можешь устроить стрим на твиче, как ты программируешь, транслировать всё это в чат нет необходимости
Kirill
это нижняя сторона C++)
Для этого есть godbolt. Это во первых. Во вторых этот нечитаемый Пипец с тонной magic numbers и вырвигюглазным синтаксисом не просто является эталонным примером premature optimization. оно еще и написано в стиле универских лаб
Kirill
Сотни статей и десятки книг посвящены именно тому, что так писать нельзя