С.
Продвинутый новичок
Мне понадобилась транслитерации с русского на латынь, но так, чтобы можно было перевести ее назад в кириллицу. Я использовал метод HK (Harvard-Kyoto) – обратимая транслитерация с санскрита и обратно. Адаптировал ее для русского.
Где она может пригодиться?
Где она может пригодиться?
- Там, хранение ID в мультибайтах проблематично
- Альтернатива URL-code (визуальная читабельность)
PHP:
function hk_translit($str, $to='HK')
/*
Transliteration RU<->HK (Harvard-Kyoto method)
$to argument:
HK -- Translterate to Latin (uppercase down)
SAFE --Translterate to Latin (uppercase preserved)
RU -- Back to Russian;
*/
{
$trn=array(
'а'=>'a', 'б'=>'b', 'в'=>'v', 'г'=>'g', 'д'=>'d', 'е'=>'e', 'ё'=>'O', 'ж'=>'Z', 'з'=>'z',
'и'=>'i', 'й'=>'y', 'к'=>'k', 'л'=>'l', 'м'=>'m', 'н'=>'n', 'о'=>'o',
'п'=>'p', 'р'=>'r', 'с'=>'s', 'т'=>'t', 'у'=>'u', 'ф'=>'f', 'х'=>'h', 'ц'=>'c', 'ч'=>'C',
'ш'=>'S', 'щ'=>'T', 'ъ'=>'``', 'ы'=>'I', 'ь'=>'`', 'э'=>'E', 'ю'=>'U', 'я'=>'A',
);
if ($to=='SAFE')
{
$chars= preg_split('//u', $str, null, PREG_SPLIT_NO_EMPTY);
$str= '';
foreach ($chars as $char)
{
$charNew= $trn[$char];
if (!$charNew)
{
$testlower= mb_strtolower($char);
if ($testlower==$char) $charNew= $char; // non-letter
else // upper letter
{
$charNew= $trn[$testlower];
$charNew= '^'.$charNew;
}
}
$str.= $charNew;
}
}
elseif ($to=='RU')
{
$trn= array_flip($trn);
$caps= explode('^', $str);
if (count($caps)>1)
{
$str= '';
foreach ($caps as $word)
{
$word= strtr($word, $trn);
$str.= mb_strtoupper(mb_substr($word,0,1)) . mb_substr($word,1);
}
}
else $str= strtr($str, $trn);
}
else
{
$str= mb_strtolower($str);
$str= strtr($str, $trn);
}
return $str;
}