U200b что за символ
Текст, которого нет
Текстовые редакторы, основная задача которых — отображение моноширинного шрифта (например, кода), должны, как и следует из названия, показывать символы одной ширины.
Но есть нюанс
В Unicode есть символы, видеть которые не положено. Текстовый редактор может просто отрендерить текст с таким символом, а может предпринять какие-то действия, чтобы сделать его заметным.
Код | Пример | Название |
---|---|---|
U+2060 | foobar | WORD JOINER |
U+2061 | foobar | FUNCTION APPLICATION |
U+2062 | foobar | INVISIBLE TIMES |
U+2063 | foobar | INVISIBLE SEPARATOR |
U+180E | foobar | MONGOLIAN VOWEL SEPARATOR |
U+200B | foobar | ZERO WIDTH SPACE |
U+200C | foobar | ZERO WIDTH NON-JOINER |
U+200D | foobar | ZERO WIDTH JOINER |
U+FEFF | foobar | ZERO WIDTH NO-BREAK SPACE |
Word joiner, U+2060
Пришёл на смену zero-width no-break space (U+FEFF), потому что U+FEFF стал использоваться для кодирования BOM (byte-order mark, несколько байт в начале файла, обозначающие его кодировку и порядок байт). Этот символ запрещает перенос строки там, где он встречается.
Zero-width no-break space, U+FEFF
Устаревший символ, заменён на word joiner, использовался в тех же целях.
Zero-width joiner, U+200D
Используется в индийских и арабских шрифтах для объединения символов, которые без него не были бы соединены.
Zero-width non-joiner, U+200C
В начертаниях с лигатурами можно вставить его между буквами, чтобы лигатуры не было:
Он встречается даже на клавиатурах:
Zero-width space, U+200B
Используется, когда нужно обозначить границу слов, не вставляя пробел. Этот текст будет переноситься по словам:
Invisible Operators: function application U+2061, invisible times U+2062, invisible separator U+2063
«Невидимые операторы», добавленные в Unicode 3.2. Нужны для обозначения математических операций в выражениях.
Например, эта запись: Aij
Может означать или индекс (i, j) в двумерном массиве, или индекс i*j в одномерном. Для устранения неоднозначности можно использовать или Invisible times, или Invisible separator, чтобы было понятно, что имелось в виду.
Аналогично, f (x + y), это или умножение, или функция.
Визуально они не должны отличаться, но некоторые парсеры смогут понять, что имелось в виду.
Mongolian vowel separator, U+180E
Из названия понятно, для чего он. Этот символ уже не раз вызывал проблемы. Очень хорошо описан в этом ответе.
Как это выглядит
Конечно же, отображение зависит не только от редактора, но ещё и от шрифта, посмотрим на рендеринг текста, не меняя настроек редакторов.
Atom, Sublime, VSCode, Xamarin Studio, XCode, Notepad++:
Cat не показывает их:
Vim тоже не сообщает о некоторых символах, даже с включённой настройкой set list, а вот less справляется лучше:
GitHub, вот так показываются эти символы в pull request-ах и diff-ах:
Один из популярных редакторов кода, CodeMirror:
В том же CodeMirror, используемом jsbin, в IE часть символов видна:
ACE догадывается, что там бяка, и говорит, что что-то тут нечисто, но вот что именно — показывает не всегда:
Редакторы кода и diff tools
Редакторы на платформе IntelliJ:
Разные инструменты сравнения кода под macOS (P4Merge, FileMerge, KDiff3):
KDiff3, попытка засчитана, но этого не достаточно.
SourceTree: не обрабатывает текст вообще никак, плохо:
Tortoise, тоже почти ничего:
git diff : молодец, показал всё, ещё и выделил (хотя, на самом деле, сделал это less). Просто прекрасно, для diff tools это образец для подражания:
Anguish: brainfuck, которого нет
Кто-то сделал язык программирования Anguish, использующий только невидимые символы. Он основан на brainfuck, но использует не знаки пунктуации, а символы, о которых мы говорили выше. Есть даже интерпретатор на Perl и примеры использования.
Эксплуатация
Плохой код, фу таким быть, сделать закладку можно совсем просто:
Что делать
Пиши чистый код, %username%. Следуй best practices, их придумали не просто так, а для того чтобы держать меньше вещей в голове, в том числе своевременно замечая такие штуки. Увидел магическую строчку, странный или непроверяемый default case, ещё что-то: есть время — не поленись, перепиши как надо. Проводи код-ревью, смотри что коммитят в твою репу, поддерживай хорошее покрытие. Помни, что строке может быть не только то, что видно на экране, проверь в hex-редакторе, если возникло подозрение.
Вообще, вероятность реализации бэкдора через невидимый символ, конечно, есть, но скорее нет, чем да: найти его достаточно просто, а вставить закладку в говнокод можно и другими методами.
Евгений Степанищев
Болею, не спится мне. Вспомнил старую свою идею.
В Юникоде есть такой символ замечательный — пробел нулевой длины (код 0x200B), на печать не выводится, понимается всеми современными браузерами и большинством редакторов. Интервала между буквами, как следует из названия, не даёт.
Идея простая, позволяет прятать в текст другой текст, так, чтобы первый не менялся, а второй всегда копировался вместе с первым. Основная мысль — пользуясь буквами исходного текста, как разделителем, ставим между ними столько пробелов нулевой длины, чтобы их число равнялось коду скрываемого символа.
Например. Дан текст: «Болк», в нём надо скрыть короткий текст: «yes». Я взял английские символы, чтобы не заморачиватсья с кодировкой.
Коды символов «yes» — 121, 101, 115. Значит текст приобретает следующий вид:
[121 символ пробела нулевой длины]Б[101 символ пробела нулевой длины]о[115 символов пробела нулевой длины]лк
Можно, кстати, вычитать из кода символа 31, если мы не планируем использовать символы перевода строки и табуляции в скрываемом тексте. Небольшой код на Пайтоне, приведённый ниже, иллюстрирует идею.
Если на вход ему подать текст без пробелов нулевой длины, он добавит в него скрытый текст, иначе попытается его оттуда извлечь.
В принципе, этот подход можно применять в вебе для маркировки своих текстов — браузеры, кроме вымирающих, нормально относятся к этому символу и отображают его адекватно.
Конечно, важна длина текста — таким способом не скрыть текст, длина которого много больше исходной, но способ можно и улучшить в этом смысле. Например, в качестве прерывающего символа выбрать что-то другое, что не выводится на экран как символ. Например, управляющий символ смены направления текста или что-то в этом роде.
Кирилл Беляев
Чтобы контролировать внешний вид и поведение текста, обычного пробела не хватает. Например, отделяю пробелом в шестую часть кегля единицы измерения от значений. Или склеиваю предлоги с последующими словами. С раскладкой Бирмана неразрывный пробел вводить легко, но с пробелами, меньше обычного, она не помогает. Поэтому копировал их со страницы «Все о пробелах». Там вконце — таблица. Но всего нужного там нет. Из символов нулевой ширины есть только третий:
Название | Юникод | ХТМЛ | Мнемоника | |
1 | Zero Width No-break Space | U+FEFF | & #65279; | |
2 | Word Joiner | U+2060 | & #8288; | & NoBreak; |
3 | Zero Width Space | U+200B | & #8203; | & NegativeMediumSpace; |
4 | Zero Width Joiner | U+200D | & #8205; | & zwj; |
5 | Zero Width Non-joiner | U+200C | & #8204; | & zwnj; |
Не все эти символы — пробелы. Работают они похожим образом, поэтому их можно перепутать.
В свежем стандарте Юникода (3.2) «Word Joiner» заменил «Zero Width No-break Space», и о последнем можно забыть, несмотря на стройность названия. «Word Joiner» — непробел, но как и пробел определяет границы слов. Это влияет на поиск, парсинг, сортировку и прочее. Символ подходит для склейки конструкций вроде «км/ч» (км & NoBreak; / & NoBreak; ч).
«Zero Width Space» похож на «Word Joiner», но не склеивает слова и растягиваться при выключке по ширине, как прочие пробелы.
Управление внутри слова поручают «Zero Width Non-joiner» и «Zero Width Joiner». Например, чтобы отменить или задать лигатуру (конечно, при наличии нужных символов в шрифте). Эти символы используют в арабской, индийской, тайской, корейской и прочих письменностях без пробелов.
Как ввести символ пробела нулевой ширины (U+200B) на клавиатуре ноутбука?
существует очень похожий вопрос к этому уже (Как я могу ввести символ U+200B?) но все ответы о том, как ввести этот символ на клавиатуре ПК с Num pad, который не мой случай.
Я использую чешский (QWERTY) макет, но готов переключиться на английский (США) макет, если это необходимо.
Как ввести этот символ (U+200B) на клавиатуре ноутбука без num pad?
Edit: Я хочу сделать это в Windows, без ключа Fn, если это возможно. Если процесс «ввода» включает MS Word, копирование/вставку с какого-либо веб-сайта или что-либо еще, что легко выполнимо на стандартном ноутбуке Windows, я тоже в порядке.
5 ответов
Вы можете просто использовать программу карты символов, встроенную в Windows. В нем перечислены все символы для каждого шрифта, установленного в системе, и позволяет выбрать один и скопировать его в буфер обмена. На самом деле, я использую его, чтобы ссылаться на все коды клавиш для их ввода, в противном случае, но когда я нахожусь на своем ноутбуке, удобно просто скопировать символы из этой программы.
Вы можете скопировать U+200B как so:
Я написал небольшое приложение именно для этой цели! Она называется Npad, а это просто AutoHotkey сценарий условно переназначить обычные цифровые клавиши, чтобы вести себя как клавиши цифровой клавиатуры. Это позволяет вводить символы Юникода, используя их Alt сочетания клавиш с любой клавиатура.
инструкции:
пресс Alt + Win + N для просмотра государство из Npad без включения или выключения.
источник:
Примечание: см. ссылку для загрузки ниже для последней версии.
используйте osk.exe утилита (визуальная клавиатура) обычно в C:\windows\system32\osk.exe
символ должен быть записан в блокноте или любом другом приложении.
здесь снимок экрана: код alt 0128 в Notepad++:
надеюсь, что это поможет. Дайте нам знать.
существует, вероятно, какой-то способ имитировать клавиши цифровой клавиатуры с помощью обычных клавиш. Руководство системы должно сообщить вам, какая функциональная клавиша или другой инструмент должен использоваться для включения такого моделирования и какие клавиши должны использоваться для клавиш цифровой клавиатуры.
но тогда все становится несколько неловко.
Так что, возможно, лучший подход, чтобы загрузить и установить некоторые хорошие утилиты, как UnicodeInput (для ввода символов в кодировке Юникод) или Юникод-вход по имени (для ввода символов в формальном имени Юникода). К сожалению, для них обоих наиболее удобным способом запуска программы является ввод Alt++ с помощью клавиши»+»
поскольку я уже пользователь ClipX, есть другой способ:
вы сможете вставить этот символ в любом месте, вызвав ClipX ( Win + V по умолчанию) и выбрав липкий вы только что создали.
чтобы проверить, что он работает правильно, вы можете использовать MS Word или некоторые другой текстовый редактор, который может подсчитывать символы или отображать скрытые.
Как ввести символ ширины нулевой ширины (U + 200B) на клавиатуре ноутбука?
Я использую чешский (QWERTY) макет, но я желаю перейти на макет английского языка (США), если это необходимо.
Как ввести этот символ (U + 200B) на клавиатуре ноутбука без цифровой клавиатуры?
5 ответов
Вы можете просто использовать программу Character Map, встроенную в Windows. В нем перечислены все символы для каждого шрифта, установленного в системе, и вы можете выбрать его и скопировать в буфер обмена. Фактически, я использую его, чтобы ссылаться на все коды ключей, чтобы набирать их, в противном случае, но когда я нахожусь на своем ноутбуке, удобно только копировать символы из этой программы.
Вы можете скопировать U+200B так:
Инструкция:
Источник:
Используйте утилиту osk.exe (Visual Keyboard), как правило, в C:\windows\system32\osk.exe
Символ должен быть записан в блокнот или любое другое приложение.
Здесь выполняется захват экрана: alt code 0128 в Notepad ++:
Надеюсь на эту помощь. Сообщите нам.
Возможно, существует некоторый способ имитации клавиш numpad с помощью обычных клавиш. В руководстве системы должно быть указано, какая функциональная клавиша или другой инструмент необходимо использовать для включения такой симуляции и какие ключи должны использоваться для цифровых клавиш.
Но тогда ситуация становится несколько неуклюжей.
Затем вы сможете вставлять этот символ в любом месте, вызывая по умолчанию ClipX ( Win + V ) и выбрав только что созданный лип.
Чтобы проверить, что он работает правильно, вы можете использовать MS Word или какой-либо другой текстовый редактор, который может подсчитывать символы или отображать скрытые.