Вчера потратил почти два часа на то, чтобы найти ошибку во вроде бы правильном коде. Проблема оказалась банальной — в ключ массива «text» каким-то образом попала кириллическая буква «е». По виду она не отличается от «e» латинской, и найти проблему оказалось очень нелегко. Уверен, большинство программистов, да и просто людей, которые работают с текстовой информацией, время от времени сталкиваются с подобными неприятностями. Особенно это касается английской буквы «си» и русской «эс», которые находятся на одной и той же клавише в русской и английской раскладках. У меня этот случай далеко не первый, и поэтому я решил заняться поиском решения данной проблемы вплотную. И решение — пусть не очень элегантное, но вполне работоспособное — нашлось.
Исторически сложилось так, что я часто использую Notepad++ для работы вообще, и для написания скриптов на PHP в частности. И в нем, к примеру, имена переменных $iicuxiphametod и $іiсuхiрhаmеtоd (не обращайте внимания на странные названия — это просто пример) выглядят совершенно одинаковыми, хотя в слове справа половина символов кириллические.
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/410/3ed/ed2/4103eded2a0edbba9d18d6fc8a2816bb.png)
Первой моей мыслью было с помощью поиска по регулярным выражениям найти все строчные кириллические символы, которые находятся сразу справа или слева от латинского символа и вручную или, опять же, по регулярному выражению их заменить.
Пример поиска (шаблон (?<=[A-Za-z])[а-яёі]|[а-яёі](?=[A-Za-z]), в символьных классах "і" украинская):
![image](http://i81.photobucket.com/albums/j204/oleksandr1976/search1.png)
Результат поиска:
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/52b/9cc/32e/52b9cc32ef8a296a10894751346544f2.png)
Для простоты я не стал выбирать в символьные классы только те кириллические символы, которые похожи на латинские, а включил их все (русский и украинский алфавиты, за исключением некоторых украинских букв) — просто хотел показать сам принцип.
Как вариант такое решение можно рассматривать, но тогда каждый файл придется проверять каждый раз, когда код работает не так. А это не удобно.
Второй моей мыслью было: «А возможно ли задать для кириллицы отдельный шрифт или шрифт отдельного размера, чтобы кириллица и латиница отличались по виду уже при вводе, ошибочно введенные символы бросались бы в глаза, и их можно было бы исправить сразу, а не потом?» В Notepad++ такой опции не оказалось. Можно задать отдельные шрифты, размеры, цвет для разных языков программирования, для разных типов данных — переменных, строк, зарезервированных слов и т.д., но не для кириллицы.
Тогда я подумал, что, возможно, есть плагин, позволяющий это осуществить. Но поиски такого дополнения тоже успеха не принесли.
И тут у меня возникла светлая мысль — нужно найти такой шрифт, в котором кириллица будет отличаться от латиницы, и задать его для служебных слов, переменных и некоторых других проблемных категорий. И такие шрифты, пусть и с экзотическими названиями, нашлись (хотя нужно заметить, что таких шрифтов удалось найти не так уж много).
Вот так, например, приведенные выше имена выглядят, если для имен переменных установить шрифт SimSun-ExtB (Опции->Определение стилей->Стиль шрифта):
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/b7a/4bb/f96/b7a4bbf96639052701aeba4ac925b5fc.png)
Еще примеры:
Шрифт MingLiU-ExtB:
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/89c/a69/716/89ca69716ecd2764dc775b1e5722374b.png)
Шрифт NSimSun:
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/566/1c7/c5d/5661c7c5d857b6f1cb2004d7c35ae1b6.png)
Если пойти еще дальше, то для строковых данных можно задать шрифт, в котором кириллические символы отличаются от латинских, например, SimSun-ExtB, а для некоторых других, например, для переменных, где кириллица в обычных условиях не нужна — шрифт, в котором нет кириллицы, к примеру, шрифт Miriam Fixed. Вместо русских букв в таких шрифтах отображаются другие символы и сразу бросаются в глаза.
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/d21/5d9/47d/d215d947db403d0a30e119533b30d962.png)
Сравните одни и те же имена в шрифте Courier New:
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/410/3ed/ed2/4103eded2a0edbba9d18d6fc8a2816bb.png)
и в шрифте Miriam Fixed:
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/3a4/f20/13d/3a4f2013d40396e80fb7dd8d0fb09488.png)
Шрифты очень похожи, но во втором случае ошибочный ввод кириллического символа практически исключен.
Это решение работает для Notepad++, но я думаю, то же самое можно сделать и в некоторых других редакторах и IDE.
Надеюсь, этот способ поможет кому-то сэкономить свое время и предотвратить эти элементарные, но такие неприятные ошибки в будущем.
Исторически сложилось так, что я часто использую Notepad++ для работы вообще, и для написания скриптов на PHP в частности. И в нем, к примеру, имена переменных $iicuxiphametod и $іiсuхiрhаmеtоd (не обращайте внимания на странные названия — это просто пример) выглядят совершенно одинаковыми, хотя в слове справа половина символов кириллические.
![image](https://habrastorage.org/getpro/habr/post_images/410/3ed/ed2/4103eded2a0edbba9d18d6fc8a2816bb.png)
Первой моей мыслью было с помощью поиска по регулярным выражениям найти все строчные кириллические символы, которые находятся сразу справа или слева от латинского символа и вручную или, опять же, по регулярному выражению их заменить.
Пример поиска (шаблон (?<=[A-Za-z])[а-яёі]|[а-яёі](?=[A-Za-z]), в символьных классах "і" украинская):
![image](http://i81.photobucket.com/albums/j204/oleksandr1976/search1.png)
Результат поиска:
![image](https://habrastorage.org/getpro/habr/post_images/52b/9cc/32e/52b9cc32ef8a296a10894751346544f2.png)
Для простоты я не стал выбирать в символьные классы только те кириллические символы, которые похожи на латинские, а включил их все (русский и украинский алфавиты, за исключением некоторых украинских букв) — просто хотел показать сам принцип.
Как вариант такое решение можно рассматривать, но тогда каждый файл придется проверять каждый раз, когда код работает не так. А это не удобно.
Второй моей мыслью было: «А возможно ли задать для кириллицы отдельный шрифт или шрифт отдельного размера, чтобы кириллица и латиница отличались по виду уже при вводе, ошибочно введенные символы бросались бы в глаза, и их можно было бы исправить сразу, а не потом?» В Notepad++ такой опции не оказалось. Можно задать отдельные шрифты, размеры, цвет для разных языков программирования, для разных типов данных — переменных, строк, зарезервированных слов и т.д., но не для кириллицы.
Тогда я подумал, что, возможно, есть плагин, позволяющий это осуществить. Но поиски такого дополнения тоже успеха не принесли.
И тут у меня возникла светлая мысль — нужно найти такой шрифт, в котором кириллица будет отличаться от латиницы, и задать его для служебных слов, переменных и некоторых других проблемных категорий. И такие шрифты, пусть и с экзотическими названиями, нашлись (хотя нужно заметить, что таких шрифтов удалось найти не так уж много).
Вот так, например, приведенные выше имена выглядят, если для имен переменных установить шрифт SimSun-ExtB (Опции->Определение стилей->Стиль шрифта):
![image](https://habrastorage.org/getpro/habr/post_images/b7a/4bb/f96/b7a4bbf96639052701aeba4ac925b5fc.png)
Еще примеры:
Шрифт MingLiU-ExtB:
![image](https://habrastorage.org/getpro/habr/post_images/89c/a69/716/89ca69716ecd2764dc775b1e5722374b.png)
Шрифт NSimSun:
![image](https://habrastorage.org/getpro/habr/post_images/566/1c7/c5d/5661c7c5d857b6f1cb2004d7c35ae1b6.png)
Если пойти еще дальше, то для строковых данных можно задать шрифт, в котором кириллические символы отличаются от латинских, например, SimSun-ExtB, а для некоторых других, например, для переменных, где кириллица в обычных условиях не нужна — шрифт, в котором нет кириллицы, к примеру, шрифт Miriam Fixed. Вместо русских букв в таких шрифтах отображаются другие символы и сразу бросаются в глаза.
![image](https://habrastorage.org/getpro/habr/post_images/d21/5d9/47d/d215d947db403d0a30e119533b30d962.png)
Сравните одни и те же имена в шрифте Courier New:
![image](https://habrastorage.org/getpro/habr/post_images/410/3ed/ed2/4103eded2a0edbba9d18d6fc8a2816bb.png)
и в шрифте Miriam Fixed:
![image](https://habrastorage.org/getpro/habr/post_images/3a4/f20/13d/3a4f2013d40396e80fb7dd8d0fb09488.png)
Шрифты очень похожи, но во втором случае ошибочный ввод кириллического символа практически исключен.
Это решение работает для Notepad++, но я думаю, то же самое можно сделать и в некоторых других редакторах и IDE.
Надеюсь, этот способ поможет кому-то сэкономить свое время и предотвратить эти элементарные, но такие неприятные ошибки в будущем.