1

Тема: Третий байт или то, как не надо писать программы.

Расскажу-ка я небольшую историю, которая произошла с одним известным вам человеком.
Создал этот человек игру, назвал её Toribash. В ней были идеи, которых до этого не было в других играх, и эта игра стала популярна в некоторых кругах. Но не об этом разговор, а о третьем байте. В той игре было множество багов, но разработчик был настолько ленив, что не исправлял их годами. Игра и так приносит деньги, какой смысл париться? Был в игре и тот самый баг, о котором я хочу вам рассказать. Этот баг как раз связан с этим самым третьим байтом.
Как и в каждой мультиплеерной игре, в этой игре был чат. Но иногда случалось так, что поле чата само закрывалось, а при повторном открытии его там оказывался тот же текст, какой и был до закрытия, но была и одна проблема, которую не понять без знания некоторых основ.
Внутреннее представление текста, который находится в поле чата, использует кодировку UTF-8. В этой кодировке один символ имеет длину от одного до четырёх байт (в этом есть свои преимущества, например, остаётся полная совместимость с ASCII кодировкой, текст, использующий только символы из ASCII занимает ровно столько же байт, сколько и оригинальный текст в той кодировке). Не буду вникать в подробности о системе кодирования байт в UTF-8, не об этом разговор идёт.
Так вот, позиция курсора в том самом поле указывает на номер байта, который соответствует символу перед курсором. Всё вроде бы просто, если бы все символы были бы длиной в одинаковое количество байт. Но проблема в том, что так не всегда бывает. Как и было указано выше, при использовании только ASCII всё просто, мы смещаем эту позицию на один байт влево или вправо и мы получаем номер байта, который соответствует нужному символу. Если длина символа больше одного байта, то приходится подсчитывать, какова длина в байтах следующего или предыдущего символа и смещать указатель на нужное число байт. Требует дополнительной работы, но всё равно вполне реально осуществить. Тут и выходит на сцену наш третий байт.
При том самом беспричинном исчезновении поля и его обратного открытия указатель на символ, который следует перед курсором, сбрасывается в позицию 3. Вроде бы ничего, всё нормально, курсор просто становится перед третьим символом. Но вспомним, что этот указатель указывает на байты, а не символы, поэтому при использовании символов, находящихся все диапазона ASCII, этот указатель может указывать внутрь символа, а не на границу между символами, что не слишком хорошо. При дальнейшем наборе текста эти символы вставляются внутрь другого символа. Очевидно, что это приводит к каким-то неприятным последствиям, что и выходит на самом деле. Вместо вводимого текста появляются какие-то случайные символы, а в некоторых случаях игра вылетает. Это происходит из-за того, что Toribash при попытке отрисовки совсем уж непонятных символов вылетает, а такие символы как раз и возникают, когда проявляет себя этот баг. Единственным решением, которое вам поможет, если у вас произошла такая ситуация, когда курсор указывает внутрь символа, является или нажатие клавиш Home/End (нажатие этих клавиш переводит курсор в начало или конец строки, а в таких случаях курсор, естественно, не будет указывать внутрь символа, что нам как раз и необходимо), или просто отправка такого сообщения (это сбросит и текст в чате, и позицию курсора в начальные значения, что является самым простым решением).
Такие вот дела.

http://img146.imageshack.us/img146/8711/57267202.png
Slot: Родина это не килька в томате.


2

Re: Третий байт или то, как не надо писать программы.

Такие вот дела.



3

Re: Третий байт или то, как не надо писать программы.

Доктор Стася пишет:

или просто отправка такого сообщения

делаю так

Ходор


4

Re: Третий байт или то, как не надо писать программы.

Вот такие пироги!



5

Re: Третий байт или то, как не надо писать программы.

кээп



6

Re: Третий байт или то, как не надо писать программы.

[b]Доктор Стася[/b]
Спасибо!

http://img842.imageshack.us/img842/8974/tghtfgh.png
Чат в подписи ннада? :3 ~ЧижЭ
Нет, Молотов! Мы уже слишком стары для этого ~дефкно


7

Re: Третий байт или то, как не надо писать программы.

меня не радует этот баг, очень не радует



8

Re: Третий байт или то, как не надо писать программы.

Стася, не могла бы ты написать, как избавиться от вылетов при смене раскладки?



9

Re: Третий байт или то, как не надо писать программы.

всегда отправляю,если появляются эти долбаные символы D:<
теперь понимаю,почему [spoiler][size=70][b]HAMPA SUX[/b][/size][/spoiler]



10

Re: Третий байт или то, как не надо писать программы.

хмммм, мне кажется этой теме не место в гайд-парке, где она скоро заблудится .

[21:24:04] Жукашвили: yJlbTpaMapuH
[21:24:04] Azem: yJlbTPaMaPuH
[21:24:10] КОПрад КАПз: Хайв
[21:24:10] Az: The hive


11

Re: Третий байт или то, как не надо писать программы.

KoPCAP пишет:

хмммм, мне кажется этой теме не место в гайд-парке, где она скоро заблудится .

Я не узнаю вас в гриме. Эта тема может быть где угодно, но только не в гайдпарке D:

http://img842.imageshack.us/img842/8974/tghtfgh.png
Чат в подписи ннада? :3 ~ЧижЭ
Нет, Молотов! Мы уже слишком стары для этого ~дефкно


12

Re: Третий байт или то, как не надо писать программы.

В чате при передвижении курсора, он иногда заходит в середину слова. Для того что бы избежать этого, нажмите Home или End.
Вот и все что требовалось написать



13

Re: Третий байт или то, как не надо писать программы.

[b]Korvin[/b]
В гайдпарке же нужно только то, что требуется писать, ещё бы.
Если бы кто-нибудь решил проблему вылета при переключении на русскую раскладку (без переустановки окон), я был бы несказанно счастлив.



14

Re: Третий байт или то, как не надо писать программы.

Rigellion пишет:

сли бы кто-нибудь решил проблему вылета при переключении на русскую раскладку

Удали торибаш, мне помогло



15

Re: Третий байт или то, как не надо писать программы.

Я кстати ни разу не заметила за всё время игры в Toribash вылет из-за переключения раскладки, не знаю, почему это у вас происходит.

http://img146.imageshack.us/img146/8711/57267202.png
Slot: Родина это не килька в томате.


16

Re: Третий байт или то, как не надо писать программы.

Нет, Стася, это либо есть, либо этого вообще нету.



17

Re: Третий байт или то, как не надо писать программы.

Доктор Стася пишет:

или просто отправка такого сообщения

Я СТОЛЬКО ЧИТАЛ ЧТО БЫ ЭТО УЗНАТЬ TT



18

Re: Третий байт или то, как не надо писать программы.

клацаешь стрелочку вверх, переходит на предыдущее сообщение, а его уже можно спокойно стирать и писать что хотел...

http://puu.sh/1m1Ck


19

Re: Третий байт или то, как не надо писать программы.

2x esc тоже спасает. Я его по крайней мере клацаю



20

Re: Третий байт или то, как не надо писать программы.

Стася действительно доктор. Всем и во всем поможет. Народ, берегите её.

А я бухаю и играю на гитаре


21

Re: Третий байт или то, как не надо писать программы.

Стася- это наш тори-Малахов +



22

Re: Третий байт или то, как не надо писать программы.

[b]brooke-dice 2[/b] Петросян х_х

А я бухаю и играю на гитаре