Как транслитерировать кириллические символы на латинские буквы?
Eg Главная страница -> Glavnaja stranica
Это расширение транслитерации PHP сделало бы это очень хорошо, но я не могу установить его на свой сервер.
Было бы лучше иметь такую же реализацию, но и в PHP.
Попробуйте следующий код
$textcyr="Тествам с кирилица"; $textlat="I pone dotuk raboti!"; $cyr = [ 'а','б','в','г','д','е','ё','ж','з','и','й','к','л','м','н','о','п', 'р','с','т','у','ф','х','ц','ч','ш','щ','ъ','ы','ь','э','ю','я', 'А','Б','В','Г','Д','Е','Ё','Ж','З','И','Й','К','Л','М','Н','О','П', 'Р','С','Т','У','Ф','Х','Ц','Ч','Ш','Щ','Ъ','Ы','Ь','Э','Ю','Я' ]; $lat = [ 'a','b','v','g','d','e','io','zh','z','i','y','k','l','m','n','o','p', 'r','s','t','u','f','h','ts','ch','sh','sht','a','i','y','e','yu','ya', 'A','B','V','G','D','E','Io','Zh','Z','I','Y','K','L','M','N','O','P', 'R','S','T','U','F','H','Ts','Ch','Sh','Sht','A','I','Y','e','Yu','Ya' ]; $textcyr = str_replace($cyr, $lat, $textcyr); $textlat = str_replace($lat, $cyr, $textlat); echo("$textcyr $textlat");
@Tural Teyyuboglu
У вашего кода есть проблема: если вы попытаетесь транслитерировать, например, «щеки» на латинский, а затем вернуться к кириллице, это произведет нечто вроде «схтеки». Многобайтные символы должны сначала отображаться в массиве следующим образом:
function transliterate($textcyr = null, $textlat = null) { $cyr = array( 'ж', 'ч', 'щ', 'ш', 'ю', 'а', 'б', 'в', 'г', 'д', 'е', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ъ', 'ь', 'я', 'Ж', 'Ч', 'Щ', 'Ш', 'Ю', 'А', 'Б', 'В', 'Г', 'Д', 'Е', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ъ', 'Ь', 'Я'); $lat = array( 'zh', 'ch', 'sht', 'sh', 'yu', 'a', 'b', 'v', 'g', 'd', 'e', 'z', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f', 'h', 'c', 'y', 'x', 'q', 'Zh', 'Ch', 'Sht', 'Sh', 'Yu', 'A', 'B', 'V', 'G', 'D', 'E', 'Z', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'F', 'H', 'c', 'Y', 'X', 'Q'); if($textcyr) return str_replace($cyr, $lat, $textcyr); else if($textlat) return str_replace($lat, $cyr, $textlat); else return null; }
echo transliterate (null, транслитератор («щеки»)) == «щеки»;
Лучший вариант – использование PHP Intl Extension. Возможно, вы захотите установить его в первую очередь.
Это сделает трюк:
$transliteratedString = transliterator_transliterate('Russian-Latin/BGN', $cyrillicString);
Я применил «русско-латынь / BGN», потому что искатель использовал русский язык в своем вопросе. Тем не менее, есть варианты для других языков, написанных на кириллице. Чтобы просмотреть все из них, выполните следующие действия:
print_r(transliterator_list_ids());
Вы должны попробовать iconv()
с опцией //TRANSLIT
.
$trstr = iconv(<your encoding here>, "ISO-8859-1//TRANSLIT", $src_str)
$textcyr="Тест на кирилице"; $textlat="Test na kirilitse!"; $cyr = array('а','б','в','г','д','е','ё','ж','з','и','й','к','л','м','н','о','п','р','с','т','у', 'ф','х','ц','ч','ш','щ','ъ', 'ы','ь', 'э', 'ю','я','А','Б','В','Г','Д','Е','Ж','З','И','Й','К','Л','М','Н','О','П','Р','С','Т','У', 'Ф','Х','Ц','Ч','Ш','Щ','Ъ', 'Ы','Ь', 'Э', 'Ю','Я' ); $lat = array( 'a','b','v','g','d','e','io','zh','z','i','y','k','l','m','n','o','p','r','s','t','u', 'f' ,'h' ,'ts' ,'ch','sh' ,'sht' ,'a', 'i', 'y', 'e' ,'yu' ,'ya','A','B','V','G','D','E','Zh', 'Z','I','Y','K','L','M','N','O','P','R','S','T','U', 'F' ,'H' ,'Ts' ,'Ch','Sh' ,'Sht' ,'A' ,'Y' ,'Yu' ,'Ya' ); $textcyr = str_replace($cyr, $lat, $textcyr); $textlat = str_replace($lat, $cyr, $textlat); echo("$textcyr $textlat");
отсутствуют буквы ё, э, ы (Э, Ы, Ё)
Я написал полный транслитерационный класс для всех европейских языков для utf-8. Может помочь (комментарии написаны на польском языке, но их не так много, поэтому несколько советов:
Надеюсь, это поможет нескольким людям вызвать внедрение этого кошмара 🙂
Изменить: я просто заметил, что часть кода отсутствует, поэтому я поместил полный класс в Pastie: class
Поскольку все вышеперечисленное неполно, вот моя версия:
$textcyr="Тест на кирилице"; $textlat="Test na kirilitse!"; $cyr = array('а','б','в','г','д','е','ё','ж','з','и','й','к','л','м','н','о','п','р','с','т','у', 'ф','х','ц','ч','ш','щ','ъ', 'ы','ь', 'э', 'ю','я', 'А','Б','В','Г','Д','Е','Ё','Ж','З','И','Й','К','Л','М','Н','О','П','Р','С','Т','У', 'Ф','Х','Ц','Ч','Ш','Щ','Ъ', 'Ы','Ь', 'Э', 'Ю','Я' ); $lat = array( 'a','b','v','g','d','e','e','zh','z','i','y','k','l','m','n','o','p','r','s','t','u', 'f' ,'h' ,'ts' ,'ch','sh' ,'sht' ,'i', 'y', 'y', 'e' ,'yu' ,'ya','A','B','V','G','D','E','E','Zh', 'Z','I','Y','K','L','M','N','O','P','R','S','T','U', 'F' ,'H' ,'Ts' ,'Ch','Sh' ,'Sht' ,'I' ,'Y' ,'Y', 'E', 'Yu' ,'Ya' ); $textcyr = str_replace($cyr, $lat, $textcyr); $textlat = str_replace($lat, $cyr, $textlat); echo("$textcyr $textlat");
Я предпочитал ё = е, ъ = i, ы = у и э = е, потому что я использую этот путь.
Вот функция, которую я использую для очистки символов на боснийском, хорватском, сербском латинском языке
function cleanUTF($name){ $name = str_replace(array('š','č','đ','č','ć','ž','ñ'),array('s','c','d','c','c','z','n'), $name); $name = str_replace(array('Š','Č','Đ','Č','Ć', 'Ž','Ñ'),array('S','C','D','C','C','Z','N'), $name); $name = str_replace(array('а','б','в','г','д','е','ё','ж','з','и','й','к','л','љ','м','н','њ','о','п','р','с','т','у','ф','х','ц','ч','џ','ш','щ','ъ','ы','ь','э','ю','я','А','Б','В','Г','Д','Е','Ё','Ж','З','И','Й','К','Л','Љ','М','Н','Њ','О','П','Р','С','Т','У','Ф','Х','Ц','Ч','Џ','Ш','Щ','Ъ','Ы','Ь','Э','Ю','Я'), array('a','b','v','g','d','e','e','z','z','i','j','k','l','lj','m','n','nj','o','p','r','s','t','u','f','h','c','c','dz','s','s','i','j','j','e','ju','ja','A','B','V','G','D','E','E','Z','Z','I','J','K','L','Lj','M','N','Nj','O','P','R','S','T','U','F','H','C','C','Dz','S','S','I','J','J','E','Ju','Ja'), $name); return $name; }
для меня лучшим решением было использовать
strtr("Информация",array('И'=>'I','н'=>'n','ф'=>'f', ...and so on... ))
Это моя версия таблицы транслитерации для русского алфавита. Это неофициальный, но основанный на технических стандартах ГОСТ 7.79-2000 и ГОСТ 16876-71. Сначала идут мультисимволы.
public static function transliterate($textcyr = null, $textlat = null) { $cyr = array( 'ё', 'ж', 'х', 'ц', 'ч', 'щ', 'ш', 'ъ', 'э', 'ю', 'я', 'а', 'б', 'в', 'г', 'д', 'е', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'ь', 'Ё', 'Ж', 'Х', 'Ц', 'Ч', 'Щ', 'Ш', 'Ъ', 'Э', 'Ю', 'Я', 'А', 'Б', 'В', 'Г', 'Д', 'Е', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Ь'); $lat = array( 'yo', 'zh', 'kh', 'ts', 'ch', 'shh', 'sh', '``', 'eh', 'yu', 'ya', 'a', 'b', 'v', 'g', 'd', 'e', 'z', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f', '`', 'Yo', 'Zh', 'Kh', 'Ts', 'Ch', 'Shh', 'Sh', '``', 'Eh', 'Yu', 'Ya', 'A', 'B', 'V', 'G', 'D', 'E', 'Z', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'F', '`'); if($textcyr) return str_replace($cyr, $lat, $textcyr); else if($textlat) return str_replace($lat, $cyr, $textlat); else return null; }
$textcyr = 'Њушка Ћушка Љубав Ђато ђата части '; $textlat = 'Ljubav njuška džoša Džoša'; $textlat = str_replace("nj","њ",$textlat); $textlat = str_replace("Nj","Њ",$textlat); $textlat = str_replace("lj","љ",$textlat); $textlat = str_replace("Lj","Љ",$textlat); $textlat = str_replace("dž","џ",$textlat); $textlat = str_replace("Dž","Џ",$textlat); $textcyr = str_replace($cyr, $lat, $textcyr); $textlat = str_replace($lat, $cyr, $textlat); echo $textcyr; echo $textlat;
Уважая правила транслитерации Yandex ( http://www.translityandex.ru/ ) и конвертируя верхний регистр:
function translit_russian_filenames( $filename ) { $info = pathinfo( $filename ); $ext = empty( $info['extension'] ) ? '' : '.' . $info['extension']; $name = basename( $filename, $ext ); $cyr = array( 'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я', 'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'ы', 'Ь', 'Э', 'Ю', 'Я' ); $lat = array( 'a', 'b', 'v', 'g', 'd', 'e', 'yo', 'zh', 'z', 'i', 'y', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f', 'h', 'c', 'ch', 'sh', 'shch', '', 'y', '', 'e', 'yu', 'ya', 'a', 'b', 'v', 'g', 'd', 'e', 'yo', 'zh', 'z', 'i', 'y', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f', 'h', 'c', 'ch', 'sh', 'shch', '', 'y', '', 'e', 'yu', 'ya'); $name_translit = str_replace($cyr, $lat, $name); return $name_translit . $ext; } add_filter( 'sanitize_file_name', 'translit_russian_filenames', 10 );
Это работало лучше для меня. Код с этой страницы
function ru2lat($str) { $tr = array( "А"=>"a", "Б"=>"b", "В"=>"v", "Г"=>"g", "Д"=>"d", "Е"=>"e", "Ё"=>"yo", "Ж"=>"zh", "З"=>"z", "И"=>"i", "Й"=>"j", "К"=>"k", "Л"=>"l", "М"=>"m", "Н"=>"n", "О"=>"o", "П"=>"p", "Р"=>"r", "С"=>"s", "Т"=>"t", "У"=>"u", "Ф"=>"f", "Х"=>"kh", "Ц"=>"ts", "Ч"=>"ch", "Ш"=>"sh", "Щ"=>"sch", "Ъ"=>"", "Ы"=>"y", "Ь"=>"", "Э"=>"e", "Ю"=>"yu", "Я"=>"ya", "а"=>"a", "б"=>"b", "в"=>"v", "г"=>"g", "д"=>"d", "е"=>"e", "ё"=>"yo", "ж"=>"zh", "з"=>"z", "и"=>"i", "й"=>"j", "к"=>"k", "л"=>"l", "м"=>"m", "н"=>"n", "о"=>"o", "п"=>"p", "р"=>"r", "с"=>"s", "т"=>"t", "у"=>"u", "ф"=>"f", "х"=>"kh", "ц"=>"ts", "ч"=>"ch", "ш"=>"sh", "щ"=>"sch", "ъ"=>"", "ы"=>"y", "ь"=>"", "э"=>"e", "ю"=>"yu", "я"=>"ya", " "=>"-", "."=>"", ","=>"", "/"=>"-", ":"=>"", ";"=>"","—"=>"", "–"=>"-" ); return strtr($str,$tr); }
Надеюсь, это поможет кому-то.