Расскажу-ка я небольшую историю, которая произошла с одним известным вам человеком.
Создал этот человек игру, назвал её Toribash. В ней были идеи, которых до этого не было в других играх, и эта игра стала популярна в некоторых кругах. Но не об этом разговор, а о третьем байте. В той игре было множество багов, но разработчик был настолько ленив, что не исправлял их годами. Игра и так приносит деньги, какой смысл париться? Был в игре и тот самый баг, о котором я хочу вам рассказать. Этот баг как раз связан с этим самым третьим байтом.
Как и в каждой мультиплеерной игре, в этой игре был чат. Но иногда случалось так, что поле чата само закрывалось, а при повторном открытии его там оказывался тот же текст, какой и был до закрытия, но была и одна проблема, которую не понять без знания некоторых основ.
Внутреннее представление текста, который находится в поле чата, использует кодировку UTF-8. В этой кодировке один символ имеет длину от одного до четырёх байт (в этом есть свои преимущества, например, остаётся полная совместимость с ASCII кодировкой, текст, использующий только символы из ASCII занимает ровно столько же байт, сколько и оригинальный текст в той кодировке). Не буду вникать в подробности о системе кодирования байт в UTF-8, не об этом разговор идёт.
Так вот, позиция курсора в том самом поле указывает на номер байта, который соответствует символу перед курсором. Всё вроде бы просто, если бы все символы были бы длиной в одинаковое количество байт. Но проблема в том, что так не всегда бывает. Как и было указано выше, при использовании только ASCII всё просто, мы смещаем эту позицию на один байт влево или вправо и мы получаем номер байта, который соответствует нужному символу. Если длина символа больше одного байта, то приходится подсчитывать, какова длина в байтах следующего или предыдущего символа и смещать указатель на нужное число байт. Требует дополнительной работы, но всё равно вполне реально осуществить. Тут и выходит на сцену наш третий байт.
При том самом беспричинном исчезновении поля и его обратного открытия указатель на символ, который следует перед курсором, сбрасывается в позицию 3. Вроде бы ничего, всё нормально, курсор просто становится перед третьим символом. Но вспомним, что этот указатель указывает на байты, а не символы, поэтому при использовании символов, находящихся все диапазона ASCII, этот указатель может указывать внутрь символа, а не на границу между символами, что не слишком хорошо. При дальнейшем наборе текста эти символы вставляются внутрь другого символа. Очевидно, что это приводит к каким-то неприятным последствиям, что и выходит на самом деле. Вместо вводимого текста появляются какие-то случайные символы, а в некоторых случаях игра вылетает. Это происходит из-за того, что Toribash при попытке отрисовки совсем уж непонятных символов вылетает, а такие символы как раз и возникают, когда проявляет себя этот баг. Единственным решением, которое вам поможет, если у вас произошла такая ситуация, когда курсор указывает внутрь символа, является или нажатие клавиш Home/End (нажатие этих клавиш переводит курсор в начало или конец строки, а в таких случаях курсор, естественно, не будет указывать внутрь символа, что нам как раз и необходимо), или просто отправка такого сообщения (это сбросит и текст в чате, и позицию курсора в начальные значения, что является самым простым решением).
Такие вот дела.
Третий байт или то, как не надо писать программы.
Сообщений 1 страница 22 из 22
Поделиться120.11.2010 16:58:41
Поделиться220.11.2010 17:11:14
Такие вот дела.
Поделиться320.11.2010 17:13:44
или просто отправка такого сообщения
делаю так
Поделиться420.11.2010 17:15:05
Вот такие пироги!
Поделиться620.11.2010 17:19:12
Доктор Стася
Спасибо!
Поделиться720.11.2010 17:26:51
меня не радует этот баг, очень не радует
Поделиться820.11.2010 17:47:32
Стася, не могла бы ты написать, как избавиться от вылетов при смене раскладки?
Поделиться920.11.2010 18:04:57
всегда отправляю,если появляются эти долбаные символы D:<
теперь понимаю,почему
HAMPA SUX
Поделиться1020.11.2010 18:22:31
хмммм, мне кажется этой теме не место в гайд-парке, где она скоро заблудится .
Поделиться1120.11.2010 18:42:46
хмммм, мне кажется этой теме не место в гайд-парке, где она скоро заблудится .
Я не узнаю вас в гриме. Эта тема может быть где угодно, но только не в гайдпарке D:
Поделиться1220.11.2010 18:43:33
В чате при передвижении курсора, он иногда заходит в середину слова. Для того что бы избежать этого, нажмите Home или End.
Вот и все что требовалось написать
Поделиться1320.11.2010 18:56:23
Korvin
В гайдпарке же нужно только то, что требуется писать, ещё бы.
Если бы кто-нибудь решил проблему вылета при переключении на русскую раскладку (без переустановки окон), я был бы несказанно счастлив.
Отредактировано Rigellion (20.11.2010 18:57:42)
Поделиться1420.11.2010 19:01:06
сли бы кто-нибудь решил проблему вылета при переключении на русскую раскладку
Удали торибаш, мне помогло
Поделиться1520.11.2010 19:14:09
Я кстати ни разу не заметила за всё время игры в Toribash вылет из-за переключения раскладки, не знаю, почему это у вас происходит.
Поделиться1620.11.2010 19:18:25
Нет, Стася, это либо есть, либо этого вообще нету.
Поделиться1720.11.2010 19:56:31
или просто отправка такого сообщения
Я СТОЛЬКО ЧИТАЛ ЧТО БЫ ЭТО УЗНАТЬ TT
Поделиться1820.11.2010 21:34:40
клацаешь стрелочку вверх, переходит на предыдущее сообщение, а его уже можно спокойно стирать и писать что хотел...
Поделиться1920.11.2010 21:42:58
2x esc тоже спасает. Я его по крайней мере клацаю
Поделиться2021.11.2010 03:36:22
Стася действительно доктор. Всем и во всем поможет. Народ, берегите её.
Поделиться2121.11.2010 05:21:55
Стася- это наш тори-Малахов +
Поделиться2221.11.2010 06:23:09
brooke-dice 2 Петросян х_х