Тема: Кирилицю в латинь

Функція яка міняє букви кирилиці на латинські букви

function CyrillicToLatin($str)
{
$tr = array(
        "А"=>"A","Б"=>"B","В"=>"V","Г"=>"G",
        "Д"=>"D","Е"=>"E","Ж"=>"J","З"=>"Z","И"=>"I","І"=>"I",
        "Й"=>"Y","К"=>"K","Л"=>"L","М"=>"M","Н"=>"N","Є"=>"YE",
        "О"=>"O","П"=>"P","Р"=>"R","С"=>"S","Т"=>"T","Ї"=>"YI",
        "У"=>"U","Ф"=>"F","Х"=>"H","Ц"=>"TS","Ч"=>"CH",
        "Ш"=>"SH","Щ"=>"SCH","Ъ"=>"","Ы"=>"YI","Ь"=>"",
        "Э"=>"E","Ю"=>"YU","Я"=>"YA","а"=>"a","б"=>"b",
        "в"=>"v","г"=>"g","д"=>"d","е"=>"e","ж"=>"j",
        "з"=>"z","и"=>"i","й"=>"y","к"=>"k","л"=>"l","і"=>"i",
        "м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r","є"=>"ye",
        "с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"h","ї"=>"yi",
        "ц"=>"ts","ч"=>"ch","ш"=>"sh","щ"=>"sch","ъ"=>"y",
        "ы"=>"yi","ь"=>"","э"=>"e","ю"=>"yu","я"=>"ya"
        );
    return strtr($str,$tr);
}
Подякували: skyfer, ostap34PHP, 221VOLT3

2

Re: Кирилицю в латинь

Перевірили б. Ъ відображається в ніщо, а ъ — в y. Ы — це не yi, як не крути.

Подякували: koala, ostap34PHP2

3

Re: Кирилицю в латинь

В кирилиці трохи більше літер. Наприклад, у вас не всі українські літери згадані. Ну і вирівнювання було б непогано покращити, такий код читається важко. Воно звісно і не дуже потрібно, але виправляти щось таке, мені здається, легше:

$from = array( "А", "Б", "Щ",    "Ґ" );
$to   = array( "A", "B", "SHCH", "G" );
return strtr($str, array_combine( $from, $to ) );
Подякували: Betterthanyou1

4

Re: Кирилицю в латинь

quez написав:

Перевірили б. Ъ відображається в ніщо, а ъ — в y. Ы — це не yi, як не крути.

ну я російську не знаю тому є деякі неточності, взагалі я цю функцію написав для збереження фалів з українськими буквами на FTP, бо до цього букви перетворювалися на карлякі, для мене було важливо зберегти назву файла

Подякували: koala, ostap34PHP2

5

Re: Кирилицю в латинь

koala написав:

В кирилиці трохи більше літер. Наприклад, у вас не всі українські літери згадані. Ну і вирівнювання було б непогано покращити, такий код читається важко. Воно звісно і не дуже потрібно, але виправляти щось таке, мені здається, легше:

$from = array( "А", "Б", "Щ",    "Ґ" );
$to   = array( "A", "B", "SHCH", "G" );
return strtr($str, array_combine( $from, $to ) );

Таке робиться всього лише через str_replace() масив на масив без iнших функцiй.

Подякували: koala1

6 Востаннє редагувалося P.Y. (24.05.2015 12:45:01)

Re: Кирилицю в латинь

Ненайзручніший варіант латиниці, який дає неоднозначності типу «кит»=«кіт», «схов»=«шов» і зворотній автоматичній конвертації в кирилицю не підлягає.

Подякували: ostap34PHP1

7 Востаннє редагувалося Sensetivity (24.05.2015 13:26:24)

Re: Кирилицю в латинь

Як можна змішувати абетки різних мов.
Як тоді транслітити "h"? В "г" чи "х", а g? в "г" чи "ґ"?
Універсальної штуки не вийде. Принаймні без чіткої системи винятків.
Моя ф-ція. Транслітерація за стандартом http://zakon4.rada.gov.ua/laws/show/55-2010-%D0%BF
Написав для трансліту назв міст, щоб потім використовувати їх у URL. Типу city/Lviv

Прихований текст
function ua2lat($string) {
    $converter = array(
    // Малі літери
        'а' => 'a',
        'б' => 'b',
        'в' => 'v',
        'г' => 'h',
        'ґ' => 'g',
        'д' => 'd',
        'е' => 'e',
        'є' => 'ie',
        'ж' => 'zh',
        'з' => 'z',
        'и' => 'y',
        'і' => 'i',
        'ї' => 'yi',
        'й' => 'y',
        'к' => 'k',
        'л' => 'l',
        'м' => 'm',
        'н' => 'n',
        'о' => 'o',
        'п' => 'p',
        'р' => 'r',
        'с' => 's',
        'т' => 't',
        'у' => 'u',
        'ф' => 'f',
        'х' => 'kh',
        'ц' => 'ts',
        'ч' => 'ch',
        'ш' => 'sh',
        'щ' => 'shch',
        'ь' => '',
        'ю' => 'yu',
        'я' => 'ia',
       // Великі літери
        'А' => 'A',
        'Б' => 'B',
        'В' => 'V',
        'Г' => 'H',
        'Ґ' => 'G',
        'Д' => 'D',
        'Е' => 'E',
        'Є' => 'Ye',
        'Ж' => 'Zh',
        'З' => 'Z',
        'И' => 'Y',
        'І' => 'I',
        'Ї' => 'Yi',
        'Й' => 'Y',
        'К' => 'K',
        'Л' => 'L',
        'М' => 'M',
        'Н' => 'N',
        'О' => 'O',
        'П' => 'P',
        'Р' => 'R',
        'С' => 'S',
        'Т' => 'T',
        'У' => 'U',
        'Ф' => 'F',
        'Х' => 'Kh',
        'Ц' => 'Ts',
        'Ч' => 'Ch',
        'Ш' => 'Sh',
        'Щ' => 'Shch',
        'Ь' => '',
        'Ю' => 'Yu',
        'Я' => 'Ya'
    );
    return strtr($string, $converter);
}
Подякували: Betterthanyou, leofun012

8

Re: Кирилицю в латинь

Sensetivity написав:

Транслітерація за стандартом http://zakon4.rada.gov.ua/laws/show/55-2010-%D0%BF

Я не знав що є такий стандарт, це значно все спрощує.

9

Re: Кирилицю в латинь

Sensetivity написав:

Як можна змішувати абетки різних мов.
Як тоді транслітити "h"? В "г" чи "х", а g? в "г" чи "ґ"?
Універсальної штуки не вийде. Принаймні без чіткої системи винятків.

Г в h, х в x, ґ в g.

10 Востаннє редагувалося Sensetivity (24.05.2015 16:07:56)

Re: Кирилицю в латинь

quez написав:
Sensetivity написав:

Як можна змішувати абетки різних мов.
Як тоді транслітити "h"? В "г" чи "х", а g? в "г" чи "ґ"?
Універсальної штуки не вийде. Принаймні без чіткої системи винятків.

Г в h, х в x, ґ в g.

Це було риторичне питання. Оскільки автор хотів зробити трансліт для укр та рос мов. Що само-собою викликає конфлікт як мінімум цих букв.

11

Re: Кирилицю в латинь

Betterthanyou написав:
Sensetivity написав:

Транслітерація за стандартом http://zakon4.rada.gov.ua/laws/show/55-2010-%D0%BF

Я не знав що є такий стандарт, це значно все спрощує.

Стандарт, однак, не позбавлений недоліків, аналогічних згаданим вище. Для СМС годиться, але з трансліту в закордонному паспорті не завжди можна однозначно вгадати, яке там прізвище насправді.

12

Re: Кирилицю в латинь

P.Y. написав:
Betterthanyou написав:
Sensetivity написав:

Транслітерація за стандартом http://zakon4.rada.gov.ua/laws/show/55-2010-%D0%BF

Я не знав що є такий стандарт, це значно все спрощує.

Стандарт, однак, не позбавлений недоліків, аналогічних згаданим вище. Для СМС годиться, але з трансліту в закордонному паспорті не завжди можна однозначно вгадати, яке там прізвище насправді.

Не передають лише "ь" та "апостроф". Усе інше можна "розкодувати".

13

Re: Кирилицю в латинь

Отже в підсумку можна використовувати ось ці функції.

14

Re: Кирилицю в латинь

Sensetivity написав:

Не передають лише "ь" та "апостроф". Усе інше можна "розкодувати".

Для прізвищ, що містять ЬО, скидання Ь вже є проблемою. Польова=Полова
А ще плутають Й, І, Ї (Зайченко=Заїченко=Заіченко), плюс вічна проблема нерозрізнення Я/ІА, Ю/ІУ, Є/ІЕ.
Коротше, офіційний трансліт початково не розраховано на зворотнє відтворення українською мовою — це лише засіб приблизно передати українські слова для тих, хто знає лише англійську. Існують і краще пророблені системи, що забезпечують можливість транслітерації без втрат в обидва боки (напр., ТКПН), або можна самому щось придумати.

15

Re: Кирилицю в латинь

P.Y. написав:
Sensetivity написав:

Не передають лише "ь" та "апостроф". Усе інше можна "розкодувати".

Для прізвищ, що містять ЬО, скидання Ь вже є проблемою. Польова=Полова
А ще плутають Й, І, Ї (Зайченко=Заїченко=Заіченко), плюс вічна проблема нерозрізнення Я/ІА, Ю/ІУ, Є/ІЕ.
Коротше, офіційний трансліт початково не розраховано на зворотнє відтворення українською мовою — це лише засіб приблизно передати українські слова для тих, хто знає лише англійську. Існують і краще пророблені системи, що забезпечують можливість транслітерації без втрат в обидва боки (напр., ТКПН), або можна самому щось придумати.

Самому то можна придумати, але пошукові машини при пошуку дотримуються стандартів... щоправда можливо неофіційних стандартів.

Ось тут пропонують український м'який знак замінювати на апостроф, а український апостроф на подвійні лапки

16

Re: Кирилицю в латинь

P.Y. написав:
Sensetivity написав:

Не передають лише "ь" та "апостроф". Усе інше можна "розкодувати".

Для прізвищ, що містять ЬО, скидання Ь вже є проблемою. Польова=Полова
А ще плутають Й, І, Ї (Зайченко=Заїченко=Заіченко), плюс вічна проблема нерозрізнення Я/ІА, Ю/ІУ, Є/ІЕ.
Коротше, офіційний трансліт початково не розраховано на зворотнє відтворення українською мовою — це лише засіб приблизно передати українські слова для тих, хто знає лише англійську. Існують і краще пророблені системи, що забезпечують можливість транслітерації без втрат в обидва боки (напр., ТКПН), або можна самому щось придумати.

ТКПН: Сеньків Назар - Senjkiv Nazar.
Сум і журба.
Краще вже традиційний науковий.
Senʹkiv Nazar

17 Востаннє редагувалося Sensetivity (24.05.2015 21:51:39)

Re: Кирилицю в латинь

Ось тут пропонують український м'який знак замінювати на апостроф, а український апостроф на подвійні лапки

Це ж той самий стандарт 2010 року, тільки з доповненням щодо м'якого знаку та апострофа.
Але для мого завдання досить і того, що я кидав вище, в URL лапки та апострофи погано виглядають (imho)

18

Re: Кирилицю в латинь

Самому то можна придумати, але пошукові машини при пошуку дотримуються стандартів... щоправда можливо неофіційних стандартів.

Google translate уміє транслітерувати український переклад латиницею, але це точно не кабмінівський стандарт, а щось своє. Причому, той трансліт, який він генерує зараз, відрізняється від того, що використовувався рік тому (там, де Й передавалось як y̆).

19

Re: Кирилицю в латинь

ТКПН: Сеньків Назар - Senjkiv Nazar.
Сум і журба.

Сербохорваська й словенська орфографія так само передають м'яке н як nj.

20

Re: Кирилицю в латинь

в URL лапки та апострофи погано виглядають (imho)

Точніше, в url вони не допускаються (якщо йдеться про символи ' та "). Думаю, для цього краще підійшов би варіант ТКПН, але з заміною апострофа (який там використовується для відокремлення літер) на дефіс.