Можно ли верить коду в редакторе?

def maps (): print «maps maps maps»

def spam (): print «Erasing everything…» print «done.» Вы знаете, что если очень долго смотреть на следующую строку, то там останутся только три слова «spam»? s = «spam‮» , spam,»‬spam» s[1]() Действительно, первая строка очень необычная. В целом, в результате этого кода будет выполнена зловредная функция spam.Посмотреть на ideone. (Для тех кто не знает: там внизу есть вывод выполнившейся программы)

RLO В основе нашей проблемы с двунаправленным письмом лежит идея о том, что в памяти текст всегда хранится в порядке записи его человеком. В том числе при письме справа-налево, при котором текст будет отрисовываться в обратном привычному направлении.Направление отрисовки определяется автоматически по принадлежности символов конкретному алфавиту (ивриту, например) или, если это знак пунктуации или цифра, то по более хитрым правилам, в зависимости от контекста.

RLO — символ форматирования, расшифровывается как right-to-left override. Меняет направление письма на правостороннее для символов с дефолтно-левосторонним письмом. (В стандарте написано, что это может использоваться для записи таких вот идентификаторов, когда те состоят из смешанного иврита и английского и, видимо, английские включения естественно читаются справа-налево).

Ну так вот. Благодаря ему мы можем получить нашу прелесть:

s = «spam» , spam,»spam» s = «spam‮» , spam,»‬spam» PDF расшифровывается как pop directional formatting, сбрасывает эффект последнего RLO или его друзей.Нетрудно догадаться, что интерпретатор окажется равнодушен к непонятным символам в строковых литералах. А вот некоторые редакторы, вроде emacs*, Xcode, Kate, развернут промежуточный текст именно так, как это делает браузер.

* в случае emacs, возможно, поведение зависит от терминала. Но в vim и nano проблемы в том же терминале нет: оба показывают только код символа RLO в соответствующей позиции.

О других вариантах использования в коде Символ RLO не является вайтспейсовым, кроме того, python ругается на него в составе идентификаторов, что немного ограничивает возможности применения.Его приходится класть в строковые литералы, либо в комментарии. При этом к концу каждой строки файла, как параграфа, действие RLO заканчивается.

Картинки vime35201d778de40358b86097369bce2ca.pngsublime text09ac328872074544b472c58b86cd3a74.png

xcode0ce35157e37f415688adf74a5e1c2014.png

emacs1370782dfda6491994acbf69ff42851b.png

… и еще раз ссылка на ideone.

© Habrahabr.ru