Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 10.04.2012, 13:48
Новичок на форуме
Отправить личное сообщение для vaalsh Посмотреть профиль Найти все сообщения от vaalsh
 
Регистрация: 10.04.2012
Сообщений: 4

Надежный двухсторонний транслит
Здравствуйте!
Использую windows-1251, урлы на русском банерные сети не принимают.
Ищу скрипт для перевода на лат для урл и обратно на рус для запросa в базе, без ошибок обратного перевода, конечно.

Благодарю за любую помощь.

Вал.
Ответить с цитированием
  #2 (permalink)  
Старый 10.04.2012, 14:06
Аватар для cmygeHm
Профессор
Отправить личное сообщение для cmygeHm Посмотреть профиль Найти все сообщения от cmygeHm
 
Регистрация: 12.10.2010
Сообщений: 196

В инете все есть давно
Ответить с цитированием
  #3 (permalink)  
Старый 10.04.2012, 14:16
Новичок на форуме
Отправить личное сообщение для vaalsh Посмотреть профиль Найти все сообщения от vaalsh
 
Регистрация: 10.04.2012
Сообщений: 4

Сообщение от cmygeHm Посмотреть сообщение
В инете все есть давно

Надежного не нашел, а тех которые переводят
"сходит -> shodit -> шодит" действительно много!
Ответить с цитированием
  #4 (permalink)  
Старый 10.04.2012, 15:25
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

Сообщение от vaalsh
Ищу скрипт для перевода на лат для урл и обратно на рус для запросa в базе, без ошибок обратного перевода, конечно.
Сообщение от vaalsh

Надежного не нашел, а тех которые переводят
"сходит -> shodit -> шодит" действительно много!
ну дак простите,на то он транслит,а чтоб без ошибок-ну дак соварь рус-транслит сделай на несколько гиг и прицепи
Ответить с цитированием
  #5 (permalink)  
Старый 10.04.2012, 16:23
Аватар для GuardCat
Просто любитель
Отправить личное сообщение для GuardCat Посмотреть профиль Найти все сообщения от GuardCat
 
Регистрация: 13.09.2011
Сообщений: 300

dmitriymar, зачем же словарь? Есть ГОСТ 7.79-2000, который обеспечивает безошибочную двухстороннюю транслитерацию. Вот пример в лоб:
//Если с английского на русский, то передаём вторым параметром true.
transliterate = (
	function() {
		var
			rus = "щ   ш  ч  ц  ю  я  ё  ж  ъ  ы  э  а б в г д е з и й к л м н о п р с т у ф х ь".split(/ +/g),
			eng = "shh sh ch cz yu ya yo zh `` y' e` a b v g d e z i j k l m n o p r s t u f x `".split(/ +/g)
		;
		return function(text, engToRus) {
			var x;
			for(x = 0; x < rus.length; x++) {
				text = text.split(engToRus ? eng[x] : rus[x]).join(engToRus ? rus[x] : eng[x]);
				text = text.split(engToRus ? eng[x].toUpperCase() : rus[x].toUpperCase()).join(engToRus ? rus[x].toUpperCase() : eng[x].toUpperCase());	
			}
			return text;
		}
	}
)();
var txt = "Съешь ещё этих мягких французских булок, да выпей же чаю!";
alert(transliterate(txt));
alert(transliterate(transliterate(txt), true));

Последний раз редактировалось GuardCat, 10.04.2012 в 16:54.
Ответить с цитированием
  #6 (permalink)  
Старый 10.04.2012, 20:07
Новичок на форуме
Отправить личное сообщение для vaalsh Посмотреть профиль Найти все сообщения от vaalsh
 
Регистрация: 10.04.2012
Сообщений: 4

Сообщение от GuardCat Посмотреть сообщение
dmitriymar, зачем же словарь? Есть ГОСТ 7.79-2000, который обеспечивает безошибочную двухстороннюю транслитерацию. Вот пример в лоб:
//Если с английского на русский, то передаём вторым параметром true.
transliterate = (
	function() {
		var
			rus = "щ   ш  ч  ц  ю  я  ё  ж  ъ  ы  э  а б в г д е з и й к л м н о п р с т у ф х ь".split(/ +/g),
			eng = "shh sh ch cz yu ya yo zh `` y' e` a b v g d e z i j k l m n o p r s t u f x `".split(/ +/g)
		;
		return function(text, engToRus) {
			var x;
			for(x = 0; x < rus.length; x++) {
				text = text.split(engToRus ? eng[x] : rus[x]).join(engToRus ? rus[x] : eng[x]);
				text = text.split(engToRus ? eng[x].toUpperCase() : rus[x].toUpperCase()).join(engToRus ? rus[x].toUpperCase() : eng[x].toUpperCase());	
			}
			return text;
		}
	}
)();
var txt = "Съешь ещё этих мягких французских булок, да выпей же чаю!";
alert(transliterate(txt));
alert(transliterate(transliterate(txt), true));
Спасибо большое!
Забыл сказать, в исходной строке могут быть латинские символы, которые должны транслироваться без изменения...
Ответить с цитированием
  #7 (permalink)  
Старый 10.04.2012, 20:24
Аспирант
Отправить личное сообщение для wcb-falcon Посмотреть профиль Найти все сообщения от wcb-falcon
 
Регистрация: 11.06.2008
Сообщений: 31

Для преобразование в урл использую вот такую штучку
зачем преобразовывать обратно не совсем понял (я у себя в базе храню данные как оригинального названия для вывода на страницы так и урла для поиска нужного блока на вывод)
использую эту функцию можно писать название в смешаном режиме (все возможные символы) и нужные будут преобразованы а ненужные удалены
//Транслитерация кириллицы в URL
function urlRusLat(str) {
	str = str.toLowerCase(); // все в нижний регистр
		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, '');
}
Ответить с цитированием
  #8 (permalink)  
Старый 10.04.2012, 20:47
Аватар для GuardCat
Просто любитель
Отправить личное сообщение для GuardCat Посмотреть профиль Найти все сообщения от GuardCat
 
Регистрация: 13.09.2011
Сообщений: 300

vaalsh, может стоит тогда использовать encodeURIComponent?
var e = encodeURIComponent("Я вся такая строка with english letters.");
var unE = decodeURIComponent(e);
alert(e);
alert(unE);
Ответить с цитированием
  #9 (permalink)  
Старый 11.04.2012, 04:03
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

GuardCat,
Не во всех ситуациях это подходит.Для тех же адресов для поисковиков подобная транслитерация не пройдет. А для внутреннего использования,если апострофы подходят , то почему нет

Последний раз редактировалось dmitriymar, 11.04.2012 в 11:50.
Ответить с цитированием
  #10 (permalink)  
Старый 11.04.2012, 04:40
Аватар для T-sh
Профессор
Отправить личное сообщение для T-sh Посмотреть профиль Найти все сообщения от T-sh
 
Регистрация: 04.12.2009
Сообщений: 579

Сообщение от vaalsh Посмотреть сообщение
Спасибо большое!
Забыл сказать, в исходной строке могут быть латинские символы, которые должны транслироваться без изменения...
как вы себе это представляете? скрипт должен каким-то неведомым образом понять, что одни буквы изначально были латинскими,а другие были сконвертированы?

самый простой вариант реализации такого: сделать словарь, куда автоматически будут записываться слова на латинице ещё перед конвертацией кир —> лат, а при обратной конвертации: сначала смотреть в этот словарь, если такого набора символов там нет — конвертировать.
__________________
С моих слов записано верно.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Транслит с кириллицы на латиницу Beba Events/DOM/Window 3 03.11.2009 15:54