Транслитерация кириллицы в URL на JS
Приведённая ниже функция транслитерации на Javascript преобразует строку таким образом, что остаются только допустимые в URL символы. Это латинские буквы, дефис и цифры. Конечно в URI можно использовать что угодно, хоть русские буквы, но я решил для порядка ограничиться. Останутся латинские буквы, цифры и знак «-«. Кириллические буквы заменятся на аналоги(в конце поста приведена таблица транслитерации).
Данную функцию использую для составления URI из названия страницы. Насчёт соответствия какому либо ГОСТ-у не проверял, но вроде бы Яндекс понимает данную транслитерацию. Думаю код можно написать и попроще.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
function cyr2lat(str) { var cyr2latChars = new 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'], ['a', 'a'], ['b', 'b'], ['c', 'c'], ['d', 'd'], ['e', 'e'], ['f', 'f'], ['g', 'g'], ['h', 'h'], ['i', 'i'], ['j', 'j'], ['k', 'k'], ['l', 'l'], ['m', 'm'], ['n', 'n'], ['o', 'o'], ['p', 'p'], ['q', 'q'], ['r', 'r'], ['s', 's'], ['t', 't'], ['u', 'u'], ['v', 'v'], ['w', 'w'], ['x', 'x'], ['y', 'y'], ['z', 'z'], ['A', 'A'], ['B', 'B'], ['C', 'C'], ['D', 'D'],['E', 'E'], ['F', 'F'],['G', 'G'],['H', 'H'],['I', 'I'],['J', 'J'],['K', 'K'], ['L', 'L'], ['M', 'M'], ['N', 'N'], ['O', 'O'],['P', 'P'], ['Q', 'Q'],['R', 'R'],['S', 'S'],['T', 'T'],['U', 'U'],['V', 'V'], ['W', 'W'], ['X', 'X'], ['Y', 'Y'], ['Z', 'Z'], [' ', '-'],['0', '0'],['1', '1'],['2', '2'],['3', '3'], ['4', '4'],['5', '5'],['6', '6'],['7', '7'],['8', '8'],['9', '9'], ['-', '-'] ); var newStr = new String(); for (var i = 0; i < str.length; i++) { ch = str.charAt(i); var newCh = ''; for (var j = 0; j < cyr2latChars.length; j++) { if (ch == cyr2latChars[j][0]) { newCh = cyr2latChars[j][1]; } } // Если найдено совпадение, то добавляется соответствие, если нет - пустая строка newStr += newCh; } // Удаляем повторяющие знаки - Именно на них заменяются пробелы. // Так же удаляем символы перевода строки, но это наверное уже лишнее return newStr.replace(/[-]{2,}/gim, '-').replace(/\n/gim, ''); } |
Если у кого нибудь есть примеры транлитерации по ГОСТу и тем более по фен-шую Яндекса, прошу поделиться. Данный код писался на скорую руку.
И в догонку.
Таблица транслитерации
Типичные соответствия знаков в транслите (более распространенные варианты даны первыми) |
|||||
Буква | Транслит | Буква | Транслит | Буква | Транслит |
а | a | к | k, c | ч | ch, č, 4 |
б | b | л | l | ш | sh, š, w, 6 |
в | v, w | м | m | щ | sh, sch, shch, šč, shh, w |
г | g | н | n | ||
д | d, g | о | o | ъ | ‘, y, j, », #, опускается |
е | e, ye, je | п | p | ||
ё | yo, jo, io, e | р | r | ы | y, i |
ж | zh, ž, j, z, g | с | s | ь | ‘, y, j, опускается |
з | z, 3 | т | t | ||
и | i | у | u | э | e, e’, je, eh, ye |
й | y, j, i, опускается; -ий/ый → y, i |
ф | f | ||
х | h, x, kh | ю | yu, ju, iu, u | ||
ц | c, ts, z | я | ya, ja, ia, a |
Давно искал такую таблицу, где всё описано, в частности замена в зависимости от положения буквы в слове.
Отличная функция, установил себе на сайт в админку! А то раньше на php транслитерировалось причем если вдруг с локалью не угадаешь то пустоту вместо транслита получишь. JS в этом плане облегчает работу.
Кому надо в добавок написал JQuery код для удобного использования функции:
$(function() {
$(‘#inName’).change(function () {
$(‘#outName’).val(cyr2lat($(this).val()));
}
);
});
Использовать соответственно так:
(В ПРЕДЫДУЩЕМ КОММЕНТАРИИ html был вырезан случайно, поэтому дополняю тут)
Использовать соответственно так: вставляете в input id=inName (сюда вводятся исходные данные на русском)
А в input id=outName (текст в транслите на выходе)