Pull to refresh

Comments 51

кажется, разработчики немного не так поняли рвение менеджеров ровняться на apple…

Было бы интересно причину узнать, что именно там происходит

как обычно — неправильная обработка строк и протекание абстракций.
Интереснее другое: как эксплойт найти удалось. Кто-то чисто случайно кому-то это эмоджи отправил?
Ну или повторили стандартные варианты, которые уже были открыты для яблочных девайсов и прочих.
слава отличному коду и продвинутым языкам, которые умеют целиться в ногу!
Скорее всего вечный прикол с добавлением всяких склеек символов и алфавитов с прочтением наоборот.
utf8, говорили они.
Самая «совершенная» кодировка, говорили они.
После статей вида «как вычислить длину строки utf8» я очень прифигел

Можно пару ссылочек? Никак не найду похожих статей.

Можно глянуть, например, алгоритм кодирования на вики. Полагаю нормального способа узнать длину нет (если языком не предусмотрена библиотечная функция именно под utf-8) и придется играться с битовыми операциями.
UFO just landed and posted this here

utf8 это не кодировка а один из "контейнеров" для кодировки юникод. Чтобы в utf8 накосячить нужно уж очень постараться.

Очень даже легко накосячить. Стоит только выйти за значения байта > 127 и тут начинается магия не правильных последовательностей байт. А какой сюрприз мне сделали суррогатные пары в нём которые превращают два кодпойнта в один. А потом оказывается что его ещё и ограничили из за utf16 в котором как раз и используются эти соррогатные пары.

В UTF-8 нет суррогатных пар

Они есть в Unicode (диапазон 0xD8000xDBFF) и как следствие могут быть во всех контейнерах.


UnicodeData.txt


D800;<Non Private Use High Surrogate, First>;Cs;0;L;;;;;N;;;;; 
DB7F;<Non Private Use High Surrogate, Last>;Cs;0;L;;;;;N;;;;; 
DB80;<Private Use High Surrogate, First>;Cs;0;L;;;;;N;;;;; 
DBFF;<Private Use High Surrogate, Last>;Cs;0;L;;;;;N;;;;;

В Юникоде эти символы просто зарезервированы и не несут особого смысла.

Они есть в UTF-16 но это не валидные символы Unicode (в таблице Unicode этот диапазон специально из-за UTF-16 зарезервирован чтобы туда никто символов не добавлял). Кроме того у UTF-8 технически нет вообще никаких проблем с тем чтобы их кодировать хотя многие compliant readers откажуется это делать вполне справедливо интерпретировав получение зарезервированного символа как ошибку декодирования. Все же кодировать с помощью UTF-8 не саму строку а ее бинарное представление записанное с помощью UTF-16 — это определенный бред. Но никакую «склейку двух кодпоинтов в один» они в UTF-8 в любом случае не порождают.

Notepad++


  1. HEX в UTF-8 (EDA0B4EDB480)
  2. Копируем полученную строку
  3. UTF-8 в HEX (F09D8480)

Мне этот символ аж комментарий порезал ))

Тут прикол в том, что на этапе «Копируем полученную строку» вы копируете ее в кодировке utf-16, где эти самые суррогатные пары как раз и используются. Поэтому ваш Notepad++ делает преобразование utf-8 — utf-16 — utf-8.
А можно поподробнее? Не могу воспроизвести в относительно свежем N++. HEX-ASCII, ASCII-HEX — нашёл (Plugins/Converter), а HEX-UTF8 — нет.

HEX-ASCII, ASCII-HEX это оно. Надо это делать в режиме UTF-8.
Может уже поправили. У меня он старый. У меня всё старое ибо XP 64.

Разобрался. У меня была отключена анимация гифок после обновления FF, поэтому не было очевидно что происходит.

Вообще, это классический случай неожиданного поведения в случае некорректных данных.

Этот поток байт не является корректным UTF-8 потоком, и с ним нельзя делать то, что оптимистично сделал N++. У меня он работает почти так же, только показывает один квадратик вместо двух.

На всякий случай декодировал поток вручную, чтобы не зависеть от багов какого-либо перекодировщика.

В общем, олдскульным программистам, видевшим DOS 3.x и однобайтные кодировки, придётся запомнить, что в нынешнем мире массив байт — это одно, а строка символов — совсем другое. Такова нынешняя реальность.
Так проблема-то в рендерере шрифтов. Что-то не видел я, чтобы таким способом положили устройство на Windows, Linux или Android. В основном этим страдали устройства Apple, ибо кодовая база для рендерера шрифтов у них одна. Как видим, Sony подсмотрела лучшие технологии у коллег.
UFO just landed and posted this here
Да-да, то самое «видеодрайвер перестал отвечать и был восстановлен». Очень радует меня эта восстанавливаемость, порой спасало данные от полной потери.
Хм, у меня обычно после «восстановления» видеодрайвера компьютер сразу же зависает в бесконечном цикле вылетов и восстановлений…
Видел такое «восстановление» видел только один раз в жизни. Что-то подсказывает что тут уже проблемы с железом.
у меня вообще было восстановление из голубого экрана на десятке один раз, выглядело как хренова магия. но у меня и правда видяха с при… дурью, скажем так.

Я недавно в Qt репортил похожий баг — цветной эмоджи на кнопке вызывал рандомный segfault. Если интересно, могу поискать, мне кажется плюс минус похожая проблема.

Это интересно было бы посмотреть!
Внезапно проверили концепцию «Темного леса» в сети PlayStation?
Что это за такая концепция? Уже не в первый раз вижу её упоминание, но гуглится плохо.
Emogi что ли используют в сообщении таком.

Язык этот знакомым кажется мне.
Это как в былые времена SMS смерти для телефонов Siemens и некоторых др.
Парадоксальным образом, такие баги встречались и до эмодзи и хитрых кодировок. Сейчас уже простым образом не находится, что именно там глючило и почему, но в стародавние времена при наличии определенной последовательности символов в тексте происходило глухое зависание компьютера при попытке просмотреть файл по F3 в Нортон Коммандере под старым добрым ДОСом. Причем, нарваться на эту последовательность можно было и в совершенно безобидных файлах.

Это Вы ещё не знаете о "залипании" бит (не данных) при некоторых последовательностях на печатных машинках. И переход в командный режим модема при наличии "+++" в сжатых данных…
И многое, многое иное.

Если не ошибаюсь, то несколько лет назад у apple была схожая бага, окирпичивающая аппарат.

Я не понял, производитель решил полностью забить на пользователей или ему так сложно экстренно добавить в движок обработки сообщений (в движок чата, на этапе приёма сообщения) фильтр на эту последовательность? А потом уже спокойно чинить багу «как надо».
Скорее всего, там целый класс последовательностей. Захардкодишь в заплатке одну — начнут использовать другую.
А что бы определить возможные варианты («как надо»), требуется время.
UFO just landed and posted this here
Проще забанить всех кто их отправляет, и приостановить регистрацию новых пользователей…
Там такой производитель который в 2018 анонсировал смену ников и скоро начнется бета-тест… ну вы поняли.
А когда все заработает то в некоторых играх новый ник может не работать. Ну вы…

Такой вот производитель.
А когда все заработает то в некоторых играх новый ник может не работать.

А как вы себе это представляете? Они все игры должны поправить?
Изменился API. Нужно переписать код, который с ним работает.
Я представляю это себе так: при закладке системы разработчики спустили на тормозах функцию изменения ника. И было это примерно эдак в 2007 а не в 1995 когда еще можно было бы списать это.
Верю, что вы всегда всё делаете правильно и с первого раза.
Sign up to leave a comment.

Articles