|
2.25, flkghdfgklh (?), 13:22, 02/02/2021 [^] [^^] [^^^] [ответить] [↓] [п©Б∙╗ п©Б∙╙п©Б∙╛п©Б∙╒п©Б∙ёя▐Б■─п©Б∙÷я▐Б■▄п©Б∙╛я▐Б■─я▐Б■░]
| +2 +/– |
> набор стандартных буковок
Это каких? Что такое «стандартные буковки»? Ты в курсе, что бывает не только латиница и русская кириллица, но еще с десяток кириллиц, два десятка латиниц, а так же греческий, грузинский, армянский и прочие алфавиты, которые в разы старше той же кириллицы и вполне живы и используются?
| |
2.61, Ordu (ok), 23:28, 02/02/2021 [^] [^^] [^^^] [ответить] [↑] [п©Б∙╗ п©Б∙╙п©Б∙╛п©Б∙╒п©Б∙ёя▐Б■─п©Б∙÷я▐Б■▄п©Б∙╛я▐Б■─я▐Б■░]
| +/– |
Что ты имеешь в виду под "засанитайзить"? Простейшая валидация сводится к тому, чтобы разбить поток байт на char'ы таким образом, чтобы:
а. если старший первого байта 0, то это однобайтовый чар
б. если старшие биты первого байта 10, то это двухбайтовый чар, и следующий байт должен иметь 10 в старших двух битах
в. если старшие биты первого байта 110, то это трёхбайтовый чар, и следующие 2 байта должны иметь 10 в старших двух битах
г. если старшие биты первого байта 1110, то это четырёхбайтовый чар, и следующие 3 байта должны иметь 10 в старших двух битах.
д. если мы добрались до сюда, значит пора запускать процесс обработки ошибки InvalidUTF8.
Все "стандартные буковки" попадают в пункт (а), и они не будут затронуты, потому как старший бит у них 0.
По идее, в любой строковой библиотеке работающей с юникодом такая валидация должна быть, и сводится к вызову функции. Это гарантирует валидность кодирования, но какие-то из чаров прошедших таким образом проверку могут быть неопределены. Если тебе это важно, то надо таскать с собой таблички валидных чаров, и по ним ещё проверять.
Если же тебе хочется справляться с ошибками, то заменяй все байты, которые не удалось декодировать на '?', и всё. Будет по-уродски, но тут всё просто: нефиг инвалидный utf8 пихать в программу, и не будет уродства.
| |
|
|
4.65, Ordu (ok), 09:45, 03/02/2021 [^] [^^] [^^^] [ответить] [п©Б∙╗ п©Б∙╙п©Б∙╛п©Б∙╒п©Б∙ёя▐Б■─п©Б∙÷я▐Б■▄п©Б∙╛я▐Б■─я▐Б■░]
| +/– |
>> Что ты имеешь в виду под "засанитайзить"
> Опасные диапазоны для всяких имен и неожиданные кавычки с прочими неожиданно "поддерживаемыми"
> ништяками для фс, баз, жысоноф и всей такой фигни
Анрил. Обезопасить строку от всего-всего-всего -- это анрил. Либо поумерить хотелки и широту покрываемых санитайзером кейсов, либо ограничивать допустимые чары предикатом is_ascii_alphanumeric. Под любое послабление этого предиката можно придумать кейс, когда это приведёт к беде. Хотя даже так плохо -- если оно иногда alpha, а иногда numeric, то какой-нибудь библиотеке в программе может сорвать крышу, когда она, скажем, напорется на 0xfffffffffffffffffffffffffffffffffff, ей переполнит 128 битный целочисленный тип, и хрен её знает, что она сделает дальше. Начнёт читать последующие буквы как хекскод, чтобы записать его на стек, включить исполняемость стека и сделать call %esp? От программистов и их программ никогда не знаешь чего ожидать.
| |
|
|
4.73, Ordu (ok), 05:22, 06/02/2021 [^] [^^] [^^^] [ответить] [п©Б∙╗ п©Б∙╙п©Б∙╛п©Б∙╒п©Б∙ёя▐Б■─п©Б∙÷я▐Б■▄п©Б∙╛я▐Б■─я▐Б■░]
| +/– |
> Это вы про utf8, но кроме нее есть еще четыре -- utf{16|32}{b|l}
> И в довесок к этому каждая может имет, а может и не
> иметь сигнатуру в начале файла. Итого 10 вариантов.
> Мало того, вдобавок к этим десяти есть овердофига разных 8-байтных кодировок. Попробуй
> сразу разберись, что перед тобой.
Нахрен они нужны, если есть utf8? utf8 лучше всех подходит как транспортная кодировка, и я рекомендую класть на все остальные с прибором.
| |
|
|
4.79, Ordu (ok), 02:37, 02/03/2021 [^] [^^] [^^^] [ответить] [п©Б∙╗ п©Б∙╙п©Б∙╛п©Б∙╒п©Б∙ёя▐Б■─п©Б∙÷я▐Б■▄п©Б∙╛я▐Б■─я▐Б■░]
| +/– |
Неа, неграмотно. Я там напутал с первыми байтами, там должны быть значения 110..., 1110..., 11110..., чтобы взяв произвольный байт из потока можно было бы определить, является ли он первым байтом чара или байтом-продолжением (байт-продолжение выглядит как 10...). Я не люблю править уже написанные сообщения, считая что сказанное должно оставаться сказанным, и поэтому ждал когда мне укажут на косяк, чтобы довести до завершения, но никто не указал. И я забыл об этом.
| |
|
|
|
|
|
3.33, Аноним (33), 14:25, 02/02/2021 [^] [^^] [^^^] [ответить] [↓] [↑] [п©Б∙╗ п©Б∙╙п©Б∙╛п©Б∙╒п©Б∙ёя▐Б■─п©Б∙÷я▐Б■▄п©Б∙╛я▐Б■─я▐Б■░]
| +2 +/– |
Зачем добавлять синхронизатор в кп авто, нужны просто прямые руки. Зачем изолировать провода, только рукожоп может дотронуться до оголенного. Зачем закрывать шестерни станка щитком, только криворукий сможет туда сунуть свои рученки.
Зачем писать нормальные структуры данных, которые будут хранить не только указатель на буфер, но и его длину. Давайте лучше будем сами вычислять в десятке мест, причем без проверок - так же быстрее. А... где-то добавили или вычли лишнюю единицу... Ну, с кем не бывает.
| |
|
4.40, Аноним (33), 15:00, 02/02/2021 [^] [^^] [^^^] [ответить] [↓] [п©Б∙╗ п©Б∙╙п©Б∙╛п©Б∙╒п©Б∙ёя▐Б■─п©Б∙÷я▐Б■▄п©Б∙╛я▐Б■─я▐Б■░]
| +/– |
Не обязательно бросать исключение. Можно вернуть ошибку (хотя бы int или bool, если язык не дает ничего более вменяемого типа optional или tuple).
Плюс в некоторых случаях намного лучше чтобы программа просто упала, чем выдала неверный результат.
Главное чтобы нужно было проверять ограниченное количество мест внутри объекта чтобы минимизировать (не полностью исключить, а уменьшить шанс на пару порядков) вероятность ошибки. И покрыть тестами один объект существенно легче чем кучу кода.
| |
|
5.47, Сишник (?), 16:05, 02/02/2021 [^] [^^] [^^^] [ответить] [п©Б∙╗ п©Б∙╙п©Б∙╛п©Б∙╒п©Б∙ёя▐Б■─п©Б∙÷я▐Б■▄п©Б∙╛я▐Б■─я▐Б■░]
| +/– |
> Не обязательно бросать исключение. Можно вернуть ошибку (хотя бы int или bool,
> если язык не дает ничего более вменяемого типа optional или tuple).
Можно. Но тогда придётся работать учётом того, что функция может не вернуть ожидаемый результат, а это уже проверки и обработка возможной ошибки по сути, что по трудозатратам не сказать что меньше ручной проверки выхода за пределы массива.
> Плюс в некоторых случаях намного лучше чтобы программа просто упала, чем выдала
> неверный результат.
да
> Главное чтобы нужно было проверять ограниченное количество мест внутри объекта чтобы минимизировать
> (не полностью исключить, а уменьшить шанс на пару порядков) вероятность ошибки.
> И покрыть тестами один объект существенно легче чем кучу кода.
Одну сишную ни от чего не зависящую функцию покрыть тестами ничуть не сложнее, чем на любом другом языке.
| |
|
|
|
|
|
2.58, Аноним (8), 20:47, 02/02/2021 [^] [^^] [^^^] [ответить] [п©Б∙╗ п©Б∙╙п©Б∙╛п©Б∙╒п©Б∙ёя▐Б■─п©Б∙÷я▐Б■▄п©Б∙╛я▐Б■─я▐Б■░]
| –1 +/– |
Ой, китайские это очень зря. Японские я бы тоже запретил. И хинди с ивритской вязью (чисто на всякий случай). Просто из-за того как они устроены и потому, что в юникоде они имеют платформозависимые символы (ты декодируешь на линуксе и у тебя всё нормально, а потом оказывается, что все приложения на венде крашатся, да и сама она в бсод улетает).
| |
|
|