Транслитерация кириллицы в PHP

Как транслитерировать кириллические символы латинскими буквами?

E.g. Главная страница -> Glavnaja stranica

Это PHP-расширение транслитерации отлично подойдет для этого, но я не могу установить его на свой сервер.

Было бы лучше иметь такую ​​же реализацию, но на PHP.


person Sfisioza    schedule 18.09.2011    source источник


Ответы (13)


Попробуйте следующий код

$textcyr="Тествам с кирилица";
        $textlat="I pone dotuk raboti!";
        $cyr = ['Љ', 'Њ', 'Џ', 'џ', 'ш', 'ђ', 'ч', 'ћ', 'ж', 'љ', 'њ', 'Ш', 'Ђ', 'Ч', 'Ћ', 'Ж','Ц','ц', 'а','б','в','г','д','е','ё','ж','з','и','й','к','л','м','н','о','п', 'р','с','т','у','ф','х','ц','ч','ш','щ','ъ','ы','ь','э','ю','я', 'А','Б','В','Г','Д','Е','Ё','Ж','З','И','Й','К','Л','М','Н','О','П', 'Р','С','Т','У','Ф','Х','Ц','Ч','Ш','Щ','Ъ','Ы','Ь','Э','Ю','Я'
        ];
        $lat = ['Lj', 'Nj', 'Dž', 'dž', 'š', 'đ', 'č', 'ć', 'ž', 'lj', 'nj', 'Š', 'Đ', 'Č', 'Ć', 'Ž','C','c', '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");
person Tural Ali    schedule 18.09.2011
comment
Е в $ lat - кириллица и не то же самое, что e, даже если они визуально совпадают. - person Timo Huovinen; 29.04.2012
comment
Кстати, в этом массиве нет букв "ё", "ы" и "э" - person Victor Rudkov; 03.08.2012
comment
отлично работает, есть ли у вас какой-нибудь сайт / github для последней версии и заметок? - person d.raev; 05.01.2015
comment
есть опечатка: 'e' в массиве $ cyr на самом деле латинское 'e'. Они выглядят одинаково, но это затруднит дальнейшие преобразования. - person d.raev; 05.01.2015
comment
@TuralAliyev, спасибо, но я прокомментировал этот пост 4 года назад. И это уже было отредактировано. - person Victor Rudkov; 23.11.2016
comment
@TuralAliyev А как насчет пропуска тегов html при переводе лат в критический? - person Nuriddin Rashidov; 19.03.2018

@Tural Тейюбоглу

В вашем коде есть проблема: если вы попытаетесь транслитерировать, например, «щеки» на латынь, а затем обратно на кириллицу, получится что-то вроде «схтеки». Многобайтовые символы должны появиться первыми в массиве следующим образом:

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 транслитерировать (ноль, транслитерировать ("щеки")) == "щеки";

person bobef    schedule 27.11.2011
comment
Я проверил свой код с 40k словами из словаря, и в нем есть недостатки в случаях вроде безизходен - ›bezizhoden -› безижоден. Если мне удастся найти решение, которое сохраняет удобочитаемость и без потерь, я опубликую решение (на моем сайте). - person bobef; 01.12.2011
comment
да. Я обнаружил, что нет решения без потерь. Просто в одном алфавите ~ 30 знаков, а в другом ~ 26 знаков. - person bobef; 08.08.2014
comment
есть опечатка: 'e' в массиве $ cyr на самом деле латинское 'e'. Они выглядят одинаково, но это затруднит дальнейшие преобразования. - person d.raev; 05.01.2015
comment
У вас отсутствуют Ы и Ё. - person Yaroslav; 14.03.2016
comment
Очень полезно, спасибо! Однако в этой таблице преобразования для букв ц, ъ, ь и я используется так называемое написание чата. Если вы хотите, чтобы он соответствовал правилам транслитерации, вам нужно изменить ü = ›ts, ъ =› a, ь = ›y и я =› ya. - person cheeseus; 09.07.2016
comment
Сначала должны появиться многобайтовые символы, но вы облажались ... Ваши большие многобайтовые символы должны стоять после маленьких многобайтовых символов, например, ['ж', 'ч', 'щ', 'ш', Ю, Ж, Ч, Щ, Ш, Ю, ‹строчные буквы›, ‹большие буквы›] - person Enis P. Aginić; 25.12.2019

Лучший вариант - использовать PHP Intl Extension. Возможно, вам потребуется сначала установить его.

Это поможет:

$transliteratedString = transliterator_transliterate('Russian-Latin/BGN', $cyrillicString);

Я применил «Русский-Латинский / BGN», потому что спрашивающий использовал русский язык в своем вопросе. Однако есть варианты для других языков, написанных кириллицей. Чтобы просмотреть их все, сделайте следующее:

print_r(transliterator_list_ids());
person Ilyich    schedule 30.05.2015
comment
под centos 7 и php 7.1 вы можете использовать yum install php71w-intl - person devugur; 20.05.2017

Вам следует попробовать iconv() с опцией //TRANSLIT.

$trstr = iconv(<your encoding here>, "ISO-8859-1//TRANSLIT", $src_str)
person Kerrek SB    schedule 18.09.2011
comment
Могу поспорить, что это правильный ответ, но iconv (), похоже, не поддерживает транслитерацию кириллических символов. - person Álvaro González; 27.11.2011
comment
А, понятно, у iconv() нет такой схемы транслитерации. Однако ICU это делает, поэтому, если ваш PHP скомпилирован с ICU, вы можете использовать transliterate . (Возможно, вам потребуется aptitude install php5-intl это на вашем компьютере под управлением Debian.) - person Kerrek SB; 27.11.2011

$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");

отсутствуют буквы ё, э, ы (Э, Ы, Ё)

person Av007    schedule 20.03.2013
comment
большой Ё все еще отсутствует. Из 3 ответов ни один не смог написать полный алфавит. - person Gherman; 10.06.2014

Вот функция, которую я использую для очистки символов на боснийском, хорватском, сербском латыни.

 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;
    }
person Boris Janjetovic    schedule 29.09.2015

Это моя версия таблицы транслитерации русского алфавита. Неофициально, но основано на технических стандартах ГОСТ 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;
}
person user5720164    schedule 14.05.2016

Я написал полный класс транслитерации для всех европейских языков для utf-8. Может помочь (комментарии на полировке, но их немного, поэтому вот несколько советов:

  1. числа, хранящиеся в константах, являются idCountry в локальной базе данных - вы можете изменять их по своему усмотрению.
  2. «Rób transliterację dla» означает «выполнить транслитерацию для» - вы определяете страну по константному имени.
  3. «Słownik tłumaczący rosyjską cyrylicę wg standardu» означает «словарь со стандартной транслитерацией».
  4. "Tablica wycinająca akcenty z różnych znaków narodowych pobrana z http://stuffofinterest.com/misc/utf8-about.html "означает" Массив для удаления акцентов с разных языков "(это может помочь, если вы обнаружите ошибки в iconv (или не можете его использовать по какой-то причине).
  5. Методы utf2ascii и cyr2lat довольно очевидны.

Надеюсь, это поможет некоторым людям, потому что реализация этого была кошмаром :)

Изменить: я только что заметил, что часть кода отсутствует, поэтому я поместил полный класс в Pastie: class

person Tomasz Kapłoński    schedule 31.07.2012
comment
Боюсь, что кто-то может удалить или отредактировать его, поэтому дайте мне знать, если у вас есть идеи, как лучше поделиться им в безопасности. - person Tomasz Kapłoński; 31.07.2012
comment
Выглядит очень многообещающе. Я попробую, спасибо. Github - очень хорошее место, чтобы поделиться таким кодом. - person Sfisioza; 31.07.2012
comment
Протестировано на довольно большой системе, работающей в продакшене, так что она работает ... :) Но что касается github, я бы хотел немного реорганизовать его (разбить на несколько классов) и перевести комментарии, прежде чем стать настоящим открытым исходным кодом:] - person Tomasz Kapłoński; 01.08.2012
comment
Спасибо, что поделились этим, это, безусловно, лучший фрагмент, который я нашел. - person Kohjah Breese; 16.08.2014
comment
Когда я реализовывал это, это был кошмар, так что надеюсь, что это будет кому-то полезно. :) - person Tomasz Kapłoński; 17.08.2014
comment
@ TomaszKapłoński Больше не работает :( У вас есть этот код на GitHub? - person ptyskju; 10.12.2020
comment
@ptyskju Здесь: github.com/moby04/Transliteration/blob/master/translit. php - person Tomasz Kapłoński; 14.12.2020

Соблюдение правил транслитерации Яндекса (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 );
person Alexander Dolgopolskiy    schedule 11.11.2016

Этот сработал для меня лучше всего. Код взят с этой страницы

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);
}

Надеюсь, это кому-то поможет.

person pc_    schedule 27.11.2016
comment
Я наткнулся на этот комментарий и не могу понять, как он должен работать. strstr показывает ошибку, когда я пытаюсь ее выполнить needle is not a string or an integer - person Moseleyi; 19.11.2018
comment
@Moseleyi эта функция просто заменяет подстроки, php.net/manual/en/function.strtr .php - person pc_; 19.11.2018

Поскольку все вышеперечисленное неполное, вот моя версия:

    $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");

Я предпочел ё = e, ъ = i, ы = y и э = e, потому что я использую этот способ.

person fnatic    schedule 21.03.2015

если вы хотите двойное преобразование с точностью до каждой буквы, вам нужно немного улучшить методы. У меня есть перевод, используемый для URL-адреса, и параметр url ищется в базе данных. Вот почему для меня очень важно сохранять точные символы, не заменяя одного другим.

!!! Поддержка украинской символики.

/**
 * @param $string
 *
 * @return string only cyrillic letter
 */
function to_cyrillic($string):string
{
    $gost = [
        "a" => "а", "b" => "б", "v" => "в", "g" => "г", "d" => "д", "e" => "е", "yo" => "ё",
        "j" => "ж", "z" => "з", "ii" => "и", "ji" => "й", "k" => "к",
        "l" => "л", "m" => "м", "n" => "н", "o" => "о", "p" => "п", "r" => "р", "s" => "с", "t" => "т",
        "y" => "у", "f" => "ф", "h" => "х", "c" => "ц",
        "ch" => "ч", "sh" => "ш", "sch" => "щ", "ie" => "ы", "u" => "у", "ya" => "я", "A" => "А", "B" => "Б",
        "V" => "В", "G" => "Г", "D" => "Д", "E" => "Е", "Yo" => "Ё", "J" => "Ж", "Z" => "З", "I" => "И", "Ji" => "Й",
        "K" => "К", "L" => "Л", "M" => "М",
        "N" => "Н", "O" => "О", "P" => "П",
        "R" => "Р", "S" => "С", "T" => "Т", "Y" => "Ю", "F" => "Ф", "H" => "Х", "C" => "Ц", "Ch" => "Ч", "Sh" => "Ш",
        "Sch" => "Щ", "Ie" => "Ы", "U" => "У", "Ya" => "Я", "'" => "ь", "_'" => "Ь", "''" => "ъ", "_''" => "Ъ",
        "yi" => "ї", "ge" => "ґ",
        "ye" => "є",
        "Yi" => "Ї",
        "II" => "І",
        "Ge" => "Ґ",
        "YE" => "Є",
    ];
    return strtr($string, $gost);
}

/**
 * @param $string
 *
 * @return string only latin letter
 */
function to_latin($string):string
{
    $gost = [
        "а" => "a", "б" => "b", "в" => "v", "г" => "g", "д" => "d",
        "е" => "e", "ё" => "yo", "ж" => "j", "з" => "z", "и" => "ii",
        "й" => "ji", "к" => "k", "л" => "l", "м" => "m", "н" => "n",
        "о" => "o", "п" => "p", "р" => "r", "с" => "s", "т" => "t",
        "у" => "y", "ф" => "f", "х" => "h", "ц" => "c", "ч" => "ch",
        "ш" => "sh", "щ" => "sch", "ы" => "ie", "э" => "e", "ю" => "u",
        "я" => "ya",
        "А" => "A", "Б" => "B", "В" => "V", "Г" => "G", "Д" => "D",
        "Е" => "E", "Ё" => "Yo", "Ж" => "J", "З" => "Z", "И" => "I",
        "Й" => "Ji", "К" => "K", "Л" => "L", "М" => "M", "Н" => "N",
        "О" => "O", "П" => "P", "Р" => "R", "С" => "S", "Т" => "T",
        "У" => "Y", "Ф" => "F", "Х" => "H", "Ц" => "C", "Ч" => "Ch",
        "Ш" => "Sh", "Щ" => "Sch", "Ы" => "Ie", "Э" => "E", "Ю" => "U",
        "Я" => "Ya",
        "ь" => "'", "Ь" => "_'", "ъ" => "''", "Ъ" => "_''",
        "ї" => "yi",
        "і" => "ii",
        "ґ" => "ge",
        "є" => "ye",
        "Ї" => "Yi",
        "І" => "II",
        "Ґ" => "Ge",
        "Є" => "YE",
    ];
    return strtr($string, $gost);
}
person Galaxy IT    schedule 12.04.2021

для меня лучшим решением было использовать

strtr("Информация",array('И'=>'I','н'=>'n','ф'=>'f', ...and so on... ))
person Denis Rudov    schedule 06.03.2014