Про транслитерацию в интернете написано много, но Хабрахабр'е не нашел, решил написать код прямой и обратной транслитерации полностью соответствующий стандарту ISO 9:1995 7.79-2000 системы А и Б на JavaScript.
Поддерживает Русский, Белорусский, Украинский, Болгарский, Македонский языки.
Используется в России, Армении, Азербайджане, Белоруссии, Казахстане, Киргизии, Таджикистане, Туркмении, Узбекистане.
Впечатление от использования: код упростить, конечно, можно, не хватает фонетических правил, но приходится придерживаться стандарта.
/*******************************************************************************
* @Name : "translit(a, b, c)" // Имя
* @Params : a - транслируемая строка // Параметры запуска
b - флаг обратного направления
c - [012345] system A = 0; system B = (1-RUS|2-BEL|3-UKR|4-BOL|5-MAK;)
* @Descrp : Прямая и обратная транслитерация // Описание
по стандарту ISO 9 или ISO 9:1995
ГОСТ 7.79-2000 системы А и Б.
* @ExtURL : ru.wikipedia.org/wiki/ISO_9 // Внешний URL
* #Guid : {E7088033-479F-47EF-A573-BBF3520F493C} // GUID
* @Exampl : "example()" // Пример использования
* GPL applies. No warranties XGuest[02.12.2013/06:39:59] translit [ver.0.0.0.2]
*******************************************************************************/
function translit(a, b, c) {
// Символы кириллицы
var d = ["u0449", "u044F", "u0454", "u1123", "u0456", "u0457", "u0451", "u044E", "u0436", "u0447", "u0448", "u1139", "u045F", "u0491", "u0453", "u0455", "u045C", "u0459", "u045A", "u044D", "u044A", "u044B", "u045E", "u1131", "u1141", "u0446", "u0430", "u0431", "u0432", "u0433", "u0434", "u0435", "u0437", "u0438", "u0439", "u0458", "u0456", "u043A", "u043B", "u043C", "u043D", "u043E", "u043F", "u0440", "u0441", "u0442", "u0443", "u0444", "u0445", "u044C", "u2019", "u2116"],
/* Транслитерация славянских алфавитов по системе А (с использованием диакритики) */
e = [["u015D", "u00E2", "u00EA", "u011B", , "u00EF", "u00EB", "u00FB", "u017E", "u010D", "u0161", "fu0300", "du0302", "gu0300", "u01F5", "u1E91", "u1E31", "lu0302", "nu0302", "u00E8", "u02BA", "y", "u01D4", "u01CE", "u1EF3", "c", "a", "b", "v", "g", "d", "e", "z", "i", "j", "ju030C", "u00EC", "k", "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "h", "u02B9", "u02BC", "#"],
/* Транслитерация славянских алфавитов по системе Б (с использованием буквосочетаний) */
/* RUS */["shh", "ya", , "ye", "i`", , "yo", "yu", "zh", "ch", "sh", "fh", ,, ,, ,, , "e`", "``", "y`", ,, "yh", "cz", "a", "b", "v", "g", "d", "e", "z", "i", "j", , "i", "k", "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "x", "`", "'", "#"],
/* BEL */[ , "ya", ,, ,, "yo", "yu", "zh", "ch", "sh", ,, ,, ,, ,, "e`", , "y`", "u`", ,, "cz", "a", "b", "v", "g", "d", "e", "z", , "j", , "i", "k", "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "x", "`", "'", "#"],
/* UKR */["shh", "ya", "ye", ,, "yi", , "yu", "zh", "ch", "sh", ,, "g`", ,, ,, ,, ,, ,, , "cz", "a", "b", "v", "g", "d", "e", "z", "y`", "j", , "i", "k", "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "x", "`", "'", "#"],
/* BOL */["sth", "ya", , "ye", "i`", ,, "yu", "zh", "ch", "sh", "fh", ,, ,, ,, ,, "a`", ,, "o`", "yh", "cz", "a", "b", "v", "g", "d", "e", "z", "i", "j", , "i", "k", "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "x", "`", "'", "#"],
/* MAK */[ , ,, ,, ,, , "zh", "ch", "sh", , "dh", , "g`", "z`", "k`", "l`", "n`", ,, ,, ,, "cz", "a", "b", "v", "g", "d", "e", "z", "i", , "j", , "k", "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "x", , "'", "#"]
], f;
c = (typeof c === "undefined")?1:c; // Таблица по умолчанию
if (b){ // Направление транслитерации
f = e; e = d; d = f[c];
if (c) {
a = a.replace(/(c(?=[ieyjIEYJ]))/g, "cz"); // Обратное преобразование буквосочетаний
a = a.replace(/(C(?=[ieyjIEYJ]))/g, "CZ");
};
} else {
a = a.replace(/(i(?=.[^ufffdufffdufffdufffdufffdufffds]+))/ig, "$1`");
e = e[c];
}
for (f = 0;f < d.length;f++) { // Транслитерация
if (!d[f]||!e[f]) continue;
a = a.replace(new RegExp(d[f], "g"), e[f]);
a = a.replace(new RegExp(d[f].toUpperCase(), "g"), e[f].toUpperCase());
}
if (!b) {
a = a.replace(/cz(?=[ieyjIEYJ])/g, "c"); // Прямое преобразование буквосочетаний
a = a.replace(/CZ(?=[ieyjIEYJ])/g, "C");
}
return a;
}
Проверка функции:
example();
function example() {
'use strict';
var a = "Съешь ещё этих мягких французских булок, да выпей же чаю!",
// var a = "мірь", // Старославянский
b = translit(a,"");
c = translit(b,true);
console.log("Транслируемая строка:n{0}nТранслированная строка:n{1}nОбратная трансляция:n{2}",a, b, c);
}