Pull to refresh

Практическое руководство по Unicode'изации

Reading time16 min
Views28K


Мы, наконец, это сделали! Долгое время позорное наследие CP1251 раздражало разработчиков, наводило на мысли о том, что, как же так? Эпоха Unicode уже давно наступила, а мы все еще используем однобайтовую кодировку и расставляем в разных местах костыли для совместимости с внешними системами. Но причина тому была достаточно рациональная: перевести на Unicode большой проект, в который развился Мой Мир, очень трудоемко. Мы оценивали это в полгода и не были готовы тратить столько ресурсов на фичу, которая не принесет русскоязычной аудитории существенной пользы.

Но история вносит свои коррективы, зачастую весьма неожиданные. Не секрет, что в Казахстане весьма популярен проект Мой Мир, который является самой популярной социальной сетью в этой стране. И нам всегда хотелось, чтобы у наших казахских пользователей появилась возможность использовать символы казахского алфавита из расширенного кириллического набора, которым, к сожалению, не нашлось места в CP1251. И дополнительным стимулом для нас, позволившим, наконец, оправдать длительную разработку, стал дальнейший рост популярности проекта за пределами нашей страны. Мы поняли, что пора делать шаг навстречу зарубежным пользователям.

Разумеется, первое, что было необходимо для интернационализации проекта, это начать принимать, передавать, обрабатывать и хранить данные в UTF-8. Процедура эта для большого проекта непростая и длительная, по пути нам пришлось решить несколько достаточно интересных задач, про которые мы постараемся рассказать.
Читать дальше →
Total votes 74: ↑63 and ↓11+52
Comments19

ECMAScript 6. Регулярные выражения с поддержкой Unicode

Reading time5 min
Views9.8K

В ECMAScript 6 представлены два новых флага для регулярных выражений:


  1. y включает режим «липкого» сопоставления.
  2. u включает различные связанные с Unicode опции.

В данной статье объясняется влияние флага u. Эта статья будет Вам полезна, если Вы знакомы с Unicode-проблемами в Javascript.

Читать дальше →
Total votes 17: ↑16 and ↓1+15
Comments3

Security Week 45: Эфир замерз в кошельках, миллион фальшивых WhatsApp, бесполезная защита интеллектуальной собственности

Reading time5 min
Views13K
В мире фанатов технологии блокчейн все очень просто и безопасно. Еще бы, ведь блокчейн так надежен сам по себе, что для обеспечения любых финансовых операций не требует ни регулятора в лице государства, ни банков, ни других надстроек. Мы не будем спорить с тем, что технология лишена многих недостатков и уязвимостей старого мира. Но это вовсе не означает отсутствия у нее собственных слабых мест, которые раньше и вообразить-то было невозможно. В общем, такое дело: из-за уязвимости, обнаруженной в популярном Ethereum-кошельке Parity, замороженными оказались средства в криптовалюте, которые, по разным оценкам, эквивалентны 150-300 миллионам долларов США.
Читать дальше →
Total votes 16: ↑13 and ↓3+10
Comments0

Twitter опубликовал коллекцию из 872 «смайликов»

Reading time1 min
Views9.4K

Twitter выложил в открытый доступ под свободной лицензией набор из 872 эмоджи (эмотиконов), которые свободно можно использовать в своих проектах.

Содержимое коллекции опубликовали на Github. Программный код — под лицензией MIT, графика — CC-BY 4.0.

Поддержка коллекции эмоджи Twitter уже встроена в WordPress. Например, пользователи Windows могут копипастить картинки из этой таблицы, а пользователи Mac — использовать сочетание клавиш Command + Control + Space в текстовом редакторе.
Читать дальше →
Total votes 20: ↑18 and ↓2+16
Comments11

Twitter открывает исходный код движка, заменяющего эмоджи на картинки

Reading time4 min
Views8.4K
Речь здесь пойдёт о символах-картинках и о том, как отображать их.

По-японски они называются «絵文字» (где «絵» означает «картинка», а «文字» — «символ») или «えもじ», и произношение этого названия можно передавать разными способами: по Хэпбёрну «emoji», по Поливанову «эмодзи», в киричзи у Тассадара — «эмочзи», по Сергею Грису «эмоджи» через мягкий «жи». Этот последний вариант мне больше всего нравится, его-то я и стану использовать и в заголовке, и в тексте.

Что такое эмоджи? Это миниатюрные пиктограммы и идеограммы, которые можно вставлять в текст почти так же, как и буквы.

Эмоджи многочисленны. Первый набор эмоджи (который придумал Курита для технологии i-mode в 1998 или 1999 году) содержал 172 символов, состоявших всего-навсего из 12×12 пикселов. Через десять лет в Unicode 6.0 (2010 г.) было ужé 722 эмоджи, а стандарт нынешнего года (Unicode 7.0) дополнил их число ещё примерно четвертью тысячи эмоджи.

Эмоджи разнообразны. Среди них есть знаки эмоций (смайлики круглоголовые или со звериными ушками, а также различные жесты и позы), знаки Зодиака, шахматные фигуры, грани игральной кости, масти карт, любовные сердечки, священные символы, некоторые значки компьютерного интерфейса (GUI), стрелочки, галочки, крестики (прямые и косые), звёздочки, снежинки, обозначения разных родов транспорта, миниатюрные изображения современных элементов бытовой техники бытовых и технических приборов, орудий и инструментов, обозначения различных вариантов прогноза погоды, различных растений, цветов, зверушек, блюд (в основном японской национальной кухни), фаз луны, часов дня, празднеств, времён года, музыкальных инструментов, спортивных состязаний, аттракционов, различных зданий (гостиничных, вероисповедных, больничных, фабричных…), и так далее, и так далее.

А выражение «почти так же» я чуть выше употребил потому, что эмоджи всё же нельзя в полной мере считать обычными символами. На то есть две причины.

Читать дальше →
Total votes 22: ↑19 and ↓3+16
Comments17

Символьная уязвимость: как простое сообщение приводит к ошибкам в телефоне

Reading time6 min
Views19K
image
Кадр из фильма “Матрица” (1999)

На фоне возможностей современных смартфонов легко забыть, что мобильная связь — это очень старая технология. Одна только концепция передачи коротких текстовых сообщений была разработана более 30 лет назад. Если бы люди занялись созданием SMS в 2018 году, то, вероятно, не стали бы ограничивать одно сообщение 160 символами (в 7-битной кодировке).

Связь наследует не только ограничения, заложенные при создании. Многие ошибки, скрытые и явные, ждут своего часа годами, начиная с далекого мобильного прошлого. Со временем к ним добавляются новые аппаратные или программные недочёты. Современный смартфон — это своего рода «кремниевое творение Франкенштейна», компоненты которого создаются сторонними компаниями, чей код не полностью контролируют Apple и Google.

В таких условиях не удивляет, что один из самых главных недостатков современной связи (а также мобильных приложений и железа) — это наличие простых уязвимостей, приводящих к выводу из строя различных устройств. Достаточно нескольких символов, чтобы буквально погасить экран самого современного гаджета стоимостью более $1000. Год за годом уязвимость эксплуатируется вновь и вновь. И сегодня мы подробнее рассмотрим, как это происходит.
Читать дальше →
Total votes 29: ↑28 and ↓1+27
Comments12

Chrome 58 залатает защиту от омографических атак

Reading time3 min
Views17K


Сайт https://www.аррӏе.com/ имеет настоящий сертификат SSL (конечно же, от Let's Encrypt) и помечается в браузере как «надёжный сайт». Но на самом деле это совсем не то, что вы ожидали увидеть. Это просто демонстрация концепции — того, что некоторые современные браузеры отображают названия сайтов в Unicode вместо Punycode и вводят пользователей в заблуждение.

Punycode — это способ представления символов Unicode в названиях хостов с помощью ограниченного подмножества ASCII. Как сказано в RFC3492, Punycode — это вариант реализации более общего алгоритма Bootstring, когда строки, составленные из небольшого набора «базовых» символов (в данном случае, ASCII), могут представлять собой уникальные строки, составленные из большего набора символов (Unicode). Например, домен 短.co превращается в xn--s7y.co.

В вышеупомянутом домене https://www.аррӏе.com/ первую букву хоста можно заменить на кириллический символ «а», символ кириллического алфавита (U+0430), а не ASCII (U+0041). Это старая добрая омографическая атака, с которой давно пытаются бороться разработчики браузеров и регистраторы доменных имён.
Читать дальше →
Total votes 21: ↑19 and ↓2+17
Comments63

Справа налево. Что такое dir=rtl и как приручить арабский язык

Reading time8 min
Views39K


Привет, Хабр. Мы недавно перевели на арабский язык 2ГИС Онлайн, и хотим поделиться своим опытом адаптации интерфейса под RTL (right-to-left). Это будет актуально и для иврита, и для персидского языка.


Я разделю этот опыт на две статьи — теоретическую и практическую. Сегодня — больше про теорию. Я расскажу, зачем нам понадобилось переворачивать весь интерфейс, что для разработчика интерфейсов значит фраза «сделать арабскую версию» и как справиться с арабским языком, смешанным с английским. Особое внимание уделю алгоритму, по которому строится отображение текста смешанной направленности — unicode bidirectional algorithm.

Дальше читать
Total votes 86: ↑86 and ↓0+86
Comments48

Фишинг с символами из других раскладок в URL не уходит

Reading time3 min
Views16K
Фишинг существует уже давно. Невозможно подсчитать, какое количество людей предоставило мошенникам на блюдечке пароли от социальных сетей и почтовых сервисов, данные своих кредитных карт и банковских счетов, не удостоверившись в том, что в адресной строке в момент ввода логина и пароля был именно Vkontakte, а не Vkontaktle. Один из способов, с помощью которого можно замаскировать адрес, это использовать символы из других алфавитов.


Среди примеров фишинговых сайтов — страница polonìex.com, копирующая биржу криптовалют poloniex.com
Читать дальше →
Total votes 12: ↑12 and ↓0+12
Comments31

Пишем плагин к Microsoft DNS server для защиты от IDN spoofing

Reading time7 min
Views3K
IDN spoofing — это генерация доменных имён «похожих» на выбранное, обычно применяемая с целью заставить пользователя перейти по ссылке на ресурс злоумышленника. Далее рассмотрим более конкретный вариант атаки.

Представим, что атакуемая компания владеет доменом organization.org, и внутри этой компании используется внутренний ресурс portal.organization.org. Цель злоумышленника -получить учётные данные пользователя, и для этого он присылает ссылку через e-mail или используемый в компании мессенджер.

image

Получив подобное сообщение с большой вероятностью можно не заметить, что ссылка ведёт куда-то не туда. После перехода по ссылке будет запрошен логин\пароль, и жертва, думая, что находится на внутреннем ресурсе, введёт данные своей учётной записи. Шансы злоумышленника особенно высоки, если он уже проник за периметр, скомпрометировав систему любого сотрудника, и теперь борется за привилегии системного администратора.

Абсолютной «защиты от дурака» тут придумать не получится, но можно пробовать перехватить эту атаку на этапе разрешения имени через dns-запрос.
Читать дальше →
Total votes 21: ↑21 and ↓0+21
Comments4

Поговорим о юзернеймах

Reading time12 min
Views14K
Пару недель назад я выпустил django-registration 2.4.1. Сборки 2.4.x станут последними в версии django-registration 2.x, дальше будут выходить только исправления багов. Основная ветка сейчас готовится к версии 3.0, откуда планируется удалить кучу устаревшего хлама, накопившегося за последнее десятилетие поддержки, и я постараюсь учесть лучшие практики современных приложений Django.

В ближайшее время напишу подробнее о новой версии, но именно сейчас хочу немного поговорить об обманчиво простой проблеме, с которой приходится иметь дело. Это имена пользователей. Да, я мог бы написать одну из популярных статеек типа «Заблуждения программистов об X», но всё-таки предпочитаю реально объяснить, почему это сложнее, чем кажется, и предложить некоторые советы, как решить проблему. А не просто стебаться без полезного контекста.
Читать дальше →
Total votes 38: ↑37 and ↓1+36
Comments13

RegExp Unicode Property Escapes в JavaScript: штрихи к портрету

Reading time8 min
Views3.2K

RegExp Unicode Property Escapes перешли на 4-ю ступень и будут включены в ES2018.


В V8 они доступны без флага начиная с v6.4, поэтому готовы к использованию во всех текущих каналах Google Chrome от стабильного до Canary.


В Node.js они будут доступны без флага уже в v10 (выходит в апреле). В других версиях требуется флаг --harmony_regexp_property (Node.js v6–v9) или --harmony (Node.js v8–v9). Сейчас без флага их можно испробовать или в ночных сборках, или в ветке v8-canary.


При этом нужно иметь в виду, что сборки Node.js, скомпилированные без поддержки ICU, будут лишены возможности использовать этот класс регулярных выражений (подробнее см. Internationalization Support). Например, это касается популярной сборки под Android от сообщества Termux.


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


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

Читать дальше →
Total votes 10: ↑10 and ↓0+10
Comments2

ZalgoFuzzing: использование нестандартных методов размытия пейлоадов

Reading time3 min
Views8.4K


Использование нестандартных техник обфускации пейлоада (полезной нагрузки) при проведении тестирования на проникновение веб-приложений может позволить обходить фильтрацию защитных средств и способствовать реализации вектора атаки. В этой статье я расскажу про т.н. Z̴a҉̠͚l͍̠̫͕̮̟͕g͚o̯̬̣̻F̮̫̣̩͓͟ͅu̯z̡͉͍z̪͈̞̯̳̠ͅi̴̜̹̠̲͇n̰g̱͕̫̹͉͓ как метод обфускации (размытия) пейлоадов.
Читать дальше →
Total votes 37: ↑37 and ↓0+37
Comments3

Осторожнее с копипастом: фингерпринтинг текста непечатаемыми символами

Reading time4 min
Views60K
Не хотите читать? Посмотрите демо.

Символы нулевой ширины — это непечатаемые управляющие символы, которые не отображаются большинством приложений. Н​апример, в э​то пред​ложение я вст​авил де​сять про​​белов н​улевой ширины, вы эт​о замет​или? (Подсказка: вставьте предложение в Diff Checker, чтобы увидеть местоположение символов!). Эти символы можно использовать как уникальные «отпечатки» текста для идентификации пользователей.


Безусловно, он может здесь быть. И вы никогда не догадаетесь

Зачем?


Ну, изначальная причина не слишком интересна. Несколько лет назад я с командой участвовали в соревнованиях по различным видеоиграм. У команды была приватная страничка для важных объявлений, среди прочего. Но в итоге эти объявления стали репостить в других местах, с издевательствами над командой, раскрывая конфиденциальную информацию и командную тактику.
Читать дальше →
Total votes 101: ↑101 and ↓0+101
Comments106

Локализация приложения и поддержка RTL. Доклад Яндекс.Такси

Reading time9 min
Views4.4K
При локализации сервиса важно внимательно отнестись к согласованию переводов между собой. Руководитель группы клиентской Android-разработки Яндекс.Такси Александр Бонель рассказал, какие практики и инструменты упрощают локализацию. Во второй части доклада Саша поделился опытом поддержки языка RTL в приложении: что хорошо, а что не совсем работает у Андроида из коробки, какие проблемы возникают из-за поддержки RTL и как их минимизировать в будущем.


— В своем докладе я хочу рассказать, какие основные идеи и практики мы используем в командах разработки мобильных приложений Такси для решения вопросов, связанных с локализацией и актуализацией перевода в наших приложениях. Затем расскажу, как мы внедряли в приложение поддержку работы в режиме отрисовки справа налево.

Total votes 19: ↑17 and ↓2+15
Comments3

Когда «Zoë» !== «Zoë», или почему нужно нормализовывать Unicode-строки

Reading time6 min
Views20K
Никогда не слышали о нормализации Unicode? Вы не одиноки. Но об этом надо знать всем. Нормализация способна избавить вас от множества проблем. Рано или поздно нечто подобное тому, что показано на следующем рисунке, случается с любым разработчиком.
«Zoë» — это не «Zoë»
Читать дальше →
Total votes 62: ↑60 and ↓2+58
Comments40

Вы не сможете решить эту задачу на собеседовании

Reading time5 min
Views130K
Привет, Habr. Хочу поделиться с вами одной интересной задачей, которую многие из нас получали на собеседовании, но, вероятно, даже и не догадывались о том, что решаем ее неправильно.

Прежде всего — немного истории. Работая на должностях тимлида и техлида мне порой приходилось проводить собеседования, соответственно нужно подготовить несколько теоретических вопросов, ну и пару несложных задач, на решение которых не должно было бы уйти больше 2х-3х минут. Если с теорией все просто — мой любимый вопрос это: «чему равен typeof null?», по ответу сразу можно понять, кто сидит перед тобой, джун — просто правильно ответит, а претендент на сеньера, еще и объяснит почему. То с практикой — сложнее. Я долго не мог придумать нормальное задание, не изъезженное, типа fizz-buzz, а что-нибудь свое. Поэтому я на собеседованиях давал задания, которые сам проходил, устраиваясь на текущую работу. О первом из них и пойдет речь.
Читать дальше →
Total votes 164: ↑126 and ↓38+88
Comments419

Из жизни с Kubernetes: Как HTTP-сервер испанцев не жаловал

Reading time5 min
Views12K


Представитель нашего клиента, стек приложений которого обитает в облаке от Microsoft (Azure), обратился с проблемой: с недавнего времени часть запросов некоторых клиентов из Европы стала завершаться ошибкой 400 (Bad Request). Все приложения написаны на .NET, развёрнуты в Kubernetes…
Читать дальше →
Total votes 53: ↑51 and ↓2+49
Comments16

(Справа налево (Зазеркалье

Reading time6 min
Views9.7K

Кажется, с заголовком что-то не так? Это одна из проблем, с которыми сталкиваются веб-разработчики при добавлении поддержки таких языков, как арабский. В этой статье расскажем о проблемах, с которыми мы столкнулись, и решениях, которые придумали для поддержки арабского языка в десктопном клиенте Spotify и веб-плеере.

Локализация в Spotify — важное дело. Наша миссия состоит в том, чтобы «раскрыть потенциал человеческого творчества, предоставляя миллионам музыкантов возможность зарабатывать своим искусством на жизнь, а миллиардам поклонников — наслаждаться и вдохновляться им». Для достижения этой миссии важно, чтобы пользователи из разных стран могли эффективно общаться на своих языках. Недавно мы запустили Spotify в регионах Северной Африки и Западной Азии. Одним из языков в этих регионах является арабский. В отличие от английского, арабский читается справа налево. Это сказывается на веб-сайтах, которые хотят поддерживать арабский язык.
Читать дальше →
Total votes 26: ↑26 and ↓0+26
Comments3

varchar2 и Unicode для тех, кто ничего не понимает в базах данных Oracle или ORA-12899: value too large for column

Reading time3 min
Views15K

Так случилось, что продукт, который мы разрабатываем работает с несколькими реляционными базами данных. Сейчас это MS SQL, Postgres и Oracle. Были запуски под много чем от MySQL до покойного, наверное, Firebird и экзотических Sybase с DB2, но сказ не об этом.

Если с MS SQL и Postgres все более мене понятное-привычное, то с Oracle каждый раз нас ждут какие-то сюрпризы. Проницательный читатель сразу заметит, что "руки у нас кривые" и мы "попросту не умеем его готовить", но если, уважаемому читателю захочется узнать чем varchar (а точнее varchar2) в Богоподобном Oracle отличается от его собратьев, то прошу под кат.

Читать далее
Total votes 4: ↑3 and ↓1+2
Comments21