Pull to refresh

Кана-капча на PHP — это просто!

Reading time 3 min
Views 4.9K

В этом топике я кратко расскажу о кана-капче, что она из себя представляет, как она работает и как ее сделать средствами PHP.



Катакана


В японском языке для записи используются две слоговые азбуки (катакана, хирагана) и про-китайские иероглифы (кандзи). К слову, кандзи имеют мало общего в произношении с китайскими иероглифами. В Японию их завезли еще в начале нашей эры и развивались они своим путем (манъёгана). Кандзей существует бесчисленное количество (предельной степенью образованности японца считается знание 2-4 тыс. кандзи). В случае со слоговыми азбуками все проще, хирагана (может использоваться для записи чего угодно) располагает 47 базовыми знаками, то же количество символов имеется и в катакане (используется в основном для записи заимствованных слов, к примеру モニタ (мо-ни-та) — монитор).

Слоговые азбуки называются так именно потому, что каждый символ — это слог, состоящий из одной согласной и одной гласной буквы (за исключением гласных и согласной «н», у этих знаков есть свои символы). Основной считается хирагана (в некоторых случаях над кандзями прописывают транскрипцию хираганой, для удобства малообразованных людей), второстепенной же является катакана. Именно ее мы сегодня и рассмотрим.

А рассмотрим мы ее потому, что символы катаканы самые простые в написании, следовательно нам, 馬鹿外人, вводить и узнавать их будет проще. К слову, именно катакану японские дети изучают в первую очередь, по той же самой причине.

Маленькое дополнение — на картинке в начале топика катаканой написано "チューリングテスト" (ти-ю-ри-н-гу-те-су-то), что означает «Тест Тьюринга». «Тьюринг» написано катаканой, так как это иностранное имя собственное. В случае с «Тест» причиной является то, что это слово заимствованное.

Разработка


Тем временем вспомним, что же для нас, 馬鹿外人, кана-капча. Это изображение с символами катаканы\хираганы, в поле нужно ввести транскрипцию. Просто потому, что не у всех 外人 в системе есть поддержка ввода нужных нам символов.

За основу я возьму свой скрипт, и лишь чуть-чуть его модифицирую. Для начала определимся с тем, что из себя будет представлять наша кана-капча. Это будут два-три черных символа катаканы на белом фоне + пересекающие черные линии.

Для начала я хочу избавиться от всякого непотребства в моем скрипте. Убираю вырвиглазный фон, делаю текст и линии черными. Получаем вот это:


Теперь пора пихнуть в нашу картинку катакану. Первым делом определимся со шрифтом, для японских слоговых азбук я считаю лучшим вариантом MS Gothic, самый симпатичный шрифт. К моему удивлению, .TTC шрифт был воспринят PHP абсолютно нормально. Честно, я ожидал с этим типом TrueType шрифтов много геморроя.

Далее необходимо модифицировать скрипт, который генерирует код капчи. Во-первых, скормим ему новые символы, а именно: "アイウエオカキクケコサシスセソタチツテトナニネヌノハヒフヘホマミムメモヤユヨラリルレロワン". Это все основные символы катаканы. Выглядеть функция генерации будет вот так:
	function generate_code() 
	{    
		  $chars = 'アイウエオカキクケコサシスセソタチツテトナニネヌノハヒフヘホマミムメモヤユヨラリルレロワン'; 
		  $length = rand(2, 3); 
		  $numChars = mb_strlen($chars, "UTF-8"); 
		  $str = '';
		  for ($i = 0; $i < $length; $i++) {
			$str .= mb_substr($chars, rand(1, $numChars) - 1, 1, "UTF-8");
		  } 

		return $str;
	}
Обратите внимание! Я использую мультибайтовые варианты функций strlen и substr.

Затем немножечко потюним рандомные положения символов в скрипте генерации, так же введем мультибайтовые функции:
		$x = rand(0, 35);
		for($i = 0; $i < mb_strlen($code, "UTF-8"); $i++) {
			$x+=27;
			$letter=mb_substr($code, $i, 1, "UTF-8");
			imagettftext ($im, $font_arr[$n]["size"], rand(3, 4), $x, rand(54, 55), "000000", img_dir.$font_arr[$n]["fname"], $letter);
		}
В итоге мы получаем вот это:


Практически готово. Я проверил работу капчи, введя правильный вариант именно что символами катаканы. Но что же делать 馬鹿外人, у которых нету поддержки ввода японских символов? Необходимо сделать так, что бы валидация проходила с транскрипцией. Для этого придется писать целую функцию:
function kanatoroma($str){
		$replace_of = array('ア','イ','ウ','エ','オ','カ','キ','ク','ケ','コ',
			'サ','シ','ス','セ','ソ','タ','チ','ツ','テ','ト','ナ','ニ','ネ','ヌ',
			'ノ','ハ','ヒ','フ','ヘ','ホ','マ','ミ','ム','メ','モ','ヤ','ユ','ヨ',
			'ラ','リ','ル','レ','ロ','ワ','ン');
		$replace_by = array('a','i','u','e','o','ka','ki','ku',
			'ke','ko','sa','shi','su','se','so','ta','chi','tsu','te',
			'to','na','ni','ne','nu','no','ha','hi','fu','he','ho','ma',
			'mi','mu','me','mo','ya','yu','yo','ra','ri','ru','re','ro','wa','n');
        $_result = str_replace($replace_of, $replace_by, $str);
        return $_result;
    }

С помощью этой чудесной функции мы сохраняем в сессию правильное решение капчи в виде ромадзи.
Вот и все :) Кана-капча готова!
Протестировать себя на знание катаканы
Чит

Кстати, домен я такой взял специально, что бы в будущем хостить под ним всякие ништяки, которые я буду на хабре публиковать :)

И да, это не последний мой топик про капчу, самое интересное впереди :)
Tags:
Hubs:
+56
Comments 111
Comments Comments 111

Articles