@Alcospb

Как перевести слово из кирилицы в латиницу?

Привет

Нужно перевести тайтлы в eng, для использования в url.

Задача тривиальная и много раз рассмотрена в инете.

Но у меня какая-то непонятная сложность:
1. Получаем строку в UTF-8
2. Применяем к каждом отдельному символу строки (это требуется для вычленения лишних символов) strtr($str, $eng) где $eng = array(
"Є"=>"ye","І"=>"i","Ѓ"=>"G","і"=>"i","№"=>"-","є"=>"ye","ѓ"=>"g",
"А"=>"a","Б"=>"b","В"=>"v","Г"=>"g","Д"=>"d",
"Е"=>"e","Ё"=>"yo","Ж"=>"zh",
"З"=>"z","И"=>"i","Й"=>"j","К"=>"k","Л"=>"l",
"М"=>"m","Н"=>"n","О"=>"o","П"=>"p","Р"=>"r",
"С"=>"s","Т"=>"t","У"=>"u","Ф"=>"p","Х"=>"x",
"Ц"=>"c","Ч"=>"ch","Ш"=>"sh","Щ"=>"sh",
"Ы"=>"y","Э"=>"у","Ю"=>"yu","Я"=>"ya",
"а"=>"a","б"=>"b","в"=>"v","г"=>"g","д"=>"d",
"е"=>"e","ё"=>"yo","ж"=>"zh",

Так вот, в результате, strtr возвращает желаемые "замены" только для знаков пунктуации. Кирилические же символы выходят из strtr без замены.

Что делать?)

$gost = array(
        "Є"=>"ye","І"=>"i","Ѓ"=>"G","і"=>"i","№"=>"-","є"=>"ye","ѓ"=>"g",
        "А"=>"a","Б"=>"b","В"=>"v","Г"=>"g","Д"=>"d",
        "Е"=>"e","Ё"=>"yo","Ж"=>"zh",
        "З"=>"z","И"=>"i","Й"=>"j","К"=>"k","Л"=>"l",
        "М"=>"m","Н"=>"n","О"=>"o","П"=>"p","Р"=>"r",
        "С"=>"s","Т"=>"t","У"=>"u","Ф"=>"p","Х"=>"x",
        "Ц"=>"c","Ч"=>"ch","Ш"=>"sh","Щ"=>"sh",
        "Ы"=>"y","Э"=>"у","Ю"=>"yu","Я"=>"ya",
        "а"=>"a","б"=>"b","в"=>"v","г"=>"g","д"=>"d",
        "е"=>"e","ё"=>"yo","ж"=>"zh",
        "з"=>"z",'и'=>"i","й"=>"j","к"=>"k","л"=>"l",
        "м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r",
        "с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"x",
        "ц"=>"c","ч"=>"ch","ш"=>"sh","щ"=>"shh","ъ"=>"",
        "ы"=>"y","ь"=>"","э"=>"e","ю"=>"yu","я"=>"ya",
        " "=>"-", "—"=>"-", "," =>"-", "." => "-"
    );

    $nvs = $app['dbs']['remote'] -> fetchAll("
        SELECT id, title, region
        FROM objects
        WHERE region != 'spb'
    ");

    foreach ($nvs as $nv) {
        for ($i = 0; $i < strlen($nv['title']) ; $i++) {
            $letter = substr($nv['title'], $i , 1);
            echo strtr($letter, $gost);
        }
    }
  • Вопрос задан
  • 2412 просмотров
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
потому что символ кирилицы в UTF-8 занимает 2 байта, а substr вырезает только один.

Удивительно, что задача тривиальная, но ты решил ее решать не тривиальными же strtr, а через одно место автогеном
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
saboteur_kiev
@saboteur_kiev
software engineer
IMHO, проблема с кодировкой. Почитайте какие команды в PHP работают с UTF-8 (двухбайтными символами), возможно нужно использовать mb_substr вместо substr
Ответ написан
Комментировать
gluck59
@gluck59
Виртуальный глюк
function translitIt($str) 
{
    $tr = array(
        "А"=>"A","Б"=>"B","В"=>"V","Г"=>"G",
        "Д"=>"D","Е"=>"E","Ж"=>"J","З"=>"Z","И"=>"I",
        "Й"=>"Y","К"=>"K","Л"=>"L","М"=>"M","Н"=>"N",
        "О"=>"O","П"=>"P","Р"=>"R","С"=>"S","Т"=>"T",
        "У"=>"U","Ф"=>"F","Х"=>"H","Ц"=>"Ts","Ч"=>"Ch",
        "Ш"=>"Sh","Щ"=>"Sch","Ъ"=>"","Ы"=>"Yi","Ь"=>"",
        "Э"=>"E","Ю"=>"Yu","Я"=>"Ya","а"=>"a","б"=>"b",
        "в"=>"v","г"=>"g","д"=>"d","е"=>"e","ж"=>"j",
        "з"=>"z","и"=>"i","й"=>"y","к"=>"k","л"=>"l",
        "м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r",
        "с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"h",
        "ц"=>"ts","ч"=>"ch","ш"=>"sh","щ"=>"sch","ъ"=>"y",
        "ы"=>"yi","ь"=>"","э"=>"e","ю"=>"yu","я"=>"ya"
    );
    return strtr($str,$tr);
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы