gifts2017

Транслитерация в латиницу

Опубликовал Юрий (yuraer) в раздел Программирование - Практика программирования

При отправке SMSок из 1С столкнулся с тем, что текст отправлялся только латиницей, а данные-то в кириллице. В результате написал функцию перевода текста в латиницу.
Может, кому-нибудь пригодится


 

Функция глТранслит(Слово)Экспорт
 НовоеСлово= "";
 спТранслит = СоздатьОбъект("СписокЗначений");
 
 спТранслит.ДобавитьЗначение("j","й");
 спТранслит.ДобавитьЗначение("c","ц");
 спТранслит.ДобавитьЗначение("u","у");
 спТранслит.ДобавитьЗначение("k","к");
 спТранслит.ДобавитьЗначение("e","е");
 спТранслит.ДобавитьЗначение("n","н");
 спТранслит.ДобавитьЗначение("g","г");
 спТранслит.ДобавитьЗначение("sh","ш");
 спТранслит.ДобавитьЗначение("sch","щ");
 спТранслит.ДобавитьЗначение("z","з");
 спТранслит.ДобавитьЗначение("h","х");
 спТранслит.ДобавитьЗначение("#","ъ");
 спТранслит.ДобавитьЗначение("f","ф");
 спТранслит.ДобавитьЗначение("y","ы");
 спТранслит.ДобавитьЗначение("v","в");
 спТранслит.ДобавитьЗначение("a","а"); 
 спТранслит.ДобавитьЗначение("p","п"); 
 спТранслит.ДобавитьЗначение("r","р"); 
 спТранслит.ДобавитьЗначение("o","о"); 
 спТранслит.ДобавитьЗначение("l","л"); 
 спТранслит.ДобавитьЗначение("d","д"); 
 спТранслит.ДобавитьЗначение("zh","ж"); 
 спТранслит.ДобавитьЗначение("je","э"); 
 спТранслит.ДобавитьЗначение("ja","я"); 
 спТранслит.ДобавитьЗначение("ch","ч"); 
 спТранслит.ДобавитьЗначение("s","с"); 
 спТранслит.ДобавитьЗначение("m","м"); 
 спТранслит.ДобавитьЗначение("i","и"); 
 спТранслит.ДобавитьЗначение("t","т"); 
 спТранслит.ДобавитьЗначение("'","ь"); 
 спТранслит.ДобавитьЗначение("b","б"); 
 спТранслит.ДобавитьЗначение("ju","ю");
 спТранслит.ДобавитьЗначение("jo","ё");
 //Укр
 спТранслит.ДобавитьЗначение("je","є");
 спТранслит.ДобавитьЗначение("i'","ї");
 спТранслит.ДобавитьЗначение("i","і");
 //Лат
 спТранслит.ДобавитьЗначение("i","i"); 
 спТранслит.ДобавитьЗначение("q","q");
 спТранслит.ДобавитьЗначение("w","w");
 спТранслит.ДобавитьЗначение("e","e");
 спТранслит.ДобавитьЗначение("r","r");
 спТранслит.ДобавитьЗначение("t","t");
 спТранслит.ДобавитьЗначение("y","y");
 спТранслит.ДобавитьЗначение("u","u");
 спТранслит.ДобавитьЗначение("i","i");
 спТранслит.ДобавитьЗначение("o","o");
 спТранслит.ДобавитьЗначение("p","p");
 спТранслит.ДобавитьЗначение("","");
 спТранслит.ДобавитьЗначение("a","a");
 спТранслит.ДобавитьЗначение("s","s");
 спТранслит.ДобавитьЗначение("d","d");
 спТранслит.ДобавитьЗначение("f","f");
 спТранслит.ДобавитьЗначение("g","g");
 спТранслит.ДобавитьЗначение("h","h");
 спТранслит.ДобавитьЗначение("j","j");
 спТранслит.ДобавитьЗначение("k","k");
 спТранслит.ДобавитьЗначение("l","l");
 спТранслит.ДобавитьЗначение("z","z");
 спТранслит.ДобавитьЗначение("x","x");
 спТранслит.ДобавитьЗначение("c","c");
 спТранслит.ДобавитьЗначение("v","v");
 спТранслит.ДобавитьЗначение("b","b");
 спТранслит.ДобавитьЗначение("n","n");
 спТранслит.ДобавитьЗначение("m","m");
  
 спТранслит.ДобавитьЗначение(" "," ");
 спТранслит.ДобавитьЗначение("""","""");
 спТранслит.ДобавитьЗначение("-","-");
 спТранслит.ДобавитьЗначение(".",".");
 спТранслит.ДобавитьЗначение(",",",");
 спТранслит.ДобавитьЗначение("/","/");
 спТранслит.ДобавитьЗначение("\","\");
 спТранслит.ДобавитьЗначение("*","*");
 спТранслит.ДобавитьЗначение("#","#");  
 спТранслит.ДобавитьЗначение("#","№"); 
 спТранслит.ДобавитьЗначение("|","|"); 
 
 спТранслит.ДобавитьЗначение("!","!"); 
 спТранслит.ДобавитьЗначение("?","?"); 
 
 спТранслит.ДобавитьЗначение("$","$"); 
 спТранслит.ДобавитьЗначение("%","%"); 
 спТранслит.ДобавитьЗначение("@","@"); 
 спТранслит.ДобавитьЗначение("&","&"); 
 спТранслит.ДобавитьЗначение("=","="); 
 спТранслит.ДобавитьЗначение("+","+"); 
 
 спТранслит.ДобавитьЗначение("~","~"); 
 спТранслит.ДобавитьЗначение("'","'"); 
 спТранслит.ДобавитьЗначение("`","`"); 
 спТранслит.ДобавитьЗначение(":",":"); 
 спТранслит.ДобавитьЗначение(";",";"); 
 
 спТранслит.ДобавитьЗначение("(","(");
 спТранслит.ДобавитьЗначение(")",")");  
 спТранслит.ДобавитьЗначение("[","["); 
 спТранслит.ДобавитьЗначение("]","]");  
 спТранслит.ДобавитьЗначение("}","}"); 
 спТранслит.ДобавитьЗначение("{","{");
 спТранслит.ДобавитьЗначение("0","0");
 спТранслит.ДобавитьЗначение("1","1");
 спТранслит.ДобавитьЗначение("2","2");
 спТранслит.ДобавитьЗначение("3","3");
 спТранслит.ДобавитьЗначение("4","4");
 спТранслит.ДобавитьЗначение("5","5");
 спТранслит.ДобавитьЗначение("6","6");
 спТранслит.ДобавитьЗначение("7","7");
 спТранслит.ДобавитьЗначение("8","8");  
 спТранслит.ДобавитьЗначение("9","9");
 Для а=1 по СтрДлина(Слово) Цикл
  НовоеСлово = НовоеСлово + спТранслит.Получить(НРЕГ(Сред(Слово,а,1)))
 КонецЦикла; 
 
 Возврат ВРЕГ(НовоеСлово);
КонецФункции

См. также

Подписаться Добавить вознаграждение
Комментарии
1. andrey - (anddro) 02.10.09 12:44
а через массив не быстрее?
Примерно так:

Перем транслит[256] Экспорт;

Процедура ДобавитьСимвол(Символ,ВСимвол)
транслит[КодСимв(Символ) + 1] = ВСимвол;
Если Врег(Символ) <> Символ Тогда
транслит[КодСимв(ВРЕГ(Символ)) + 1] = ВРЕГ(Лев(ВСимвол,1))+Сред(ВСимвол,2);
КонецЕсли;
КонецПроцедуры

Функция ЗаполнитьТранслит();
Для Сч = 1 По 256 Цикл
транслит[сч] = Симв(сч-1);
КонецЦикла;
ДобавитьСимвол("й","j");
//.. и т.п. - только маленькие, и только то что надо транслитерировать
ДобавитьСимвол("щ","tsh");
КонецФункции
//*******************************************
Процедура Сформировать()
ЗаполнитьТранслит();
Стр = "?????????????";
РезСтр = "";
Для Сч = 1 По СтрДлина(Стр) Цикл
РезСтр = РезСтр + транслит[КодСимв(Сред(Стр,Сч,1)) + 1];
КонецЦикла;
КонецПроцедуры
2. Александр Рытов (Арчибальд) 02.10.09 15:04
3. NoMAx (NoMax) 05.10.09 16:51
(0) и тоже близкое

Функция Transliterate(srtRusWord)
strRUS = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ";
strENG = "A///B///V///G///D///E///YO//ZH//Z///I///Y///K///L///M///N//­/O///P///R///S///T///U///F///KH//TS//CH//SH//SHCH'///Y//////­/E///YU//JA//";
strResult = "";
Для i = 1 по СтрДлина(srtRusWord) Цикл
s = Сред(srtRusWord, i,1);
s=ВРег(s);
k = Найти(strRUS, s);
Если k = 0 тогда
strResult = strResult + s;
Иначе
strResult = strResult + СтрЗаменить(Сред(strENG, (k - 1) * 4 + 1, 4), "/", "");
КонецЕсли
КонецЦикла ;
Возврат strResult;
КонецФункции
EarlyBird; Papilion; arccos6pi; pchelkatoo; lamp; Hellen; orehova123; LiliaYA; Redpirate; +9 Ответить
5. Сергей Генералов (serg1c) 07.10.09 10:44
А почему не использовать посылку сразу латиницей но в UNICODE.
Например: http://infostart.ru/public/16088/
7. Кирилл (kiros) 17.01.12 11:33
Спасибо, мне пригодилось при создании пользователя в 1с8 почту писать, немного подшаманил, т.к. 8-ка и 7-ка все таки немного разные :). А так спасибо, просто и понятно.
8. Mike (air_mike) 24.01.12 09:11
(7) kiros, Аналогично. т.к. регистры важны
9. Igor Berezhnov (igorberezhnov) 31.01.13 12:22
Очень быстрая функция транслитерации. Работает с символами как верхнего, так и нижнего регистра. Встречающиеся латинские буквы и знаки препинания оставляет нетронутыми.

// Глобальная переменная
Перем ТрансХ[3];

Процедура ИнициализацияТранслитерации()
	ТрансХ[1] = "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:SCH:':Y:':E:YU:YA";
	ТрансХ[2] = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ";
	НС=1;СД=СтрДлина(ТрансХ[1]);
	Для I=1 По СтрДлина(ТрансХ[2]) Цикл
	Т=0;
	Для J=НС По СД Цикл
	Если Сред(ТрансХ[1],J,1)=":" Тогда Прервать;Иначе Т=Т+1;КонецЕсли;
	КонецЦикла;
	ТрансХ[3]=ТрансХ[3]+Симв(НС)+Симв(Т);НС=НС+Т+1;
	КонецЦикла;
КонецПроцедуры

// Прежде чем вызывать функцию транслитерации, в обязательном
// порядке должна быть однократно инициализирована строка перекодировки
// при помощи процедуры ИнициализацияТранслитерации	

Функция Транслитерация(СР)
	Р="";
	Для I=1 По СтрДлина(СР) Цикл
	СД=Сред(СР,I,1);С=ВРег(СД);ВН=?(СД<>С,1,0);
	П=Найти(ТрансХ[2],С);
	Если П>0 Тогда
	С=Сред(ТрансХ[3],(П*2)-1,2);С=Сред(ТрансХ[1],КодСимв(С),КодСимв(Прав(С,1)));
	Р=Р+?(ВН=1,НРег(С),С);
	Иначе Р=Р+С;
	КонецЕсли;
	КонецЦикла;
	Возврат Р;
КонецФункции
...Показать Скрыть
10. Сергей Золотухин (RTFM) 18.06.13 11:25
Спасибо автору! Самому впадлу было бы писать. Чуть под себя переделал.
11. Max (Masich) 15.10.13 23:07
12. Сергей Ирюпин (lamp) 20.06.14 14:52
Вставлю и свои 5 копеек :)

Функция глТранслитерация(СтрокаТекста)
	стрРус = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчш­щъыьэюя";
	стрEng = "A///B///V///G///D///E///YO//ZH//Z///I///Y///K///L///M///N//­/O///P///R///S///T///U///F///H///TS//CH//SH//SHCH'///Y///'//­/E///YU//JA//a///b///v///g///d///e///yo//zh//z///i///y///k//­/l///m///n///o///p///r///s///t///u///f///h///ts//ch//sh//shc­h'///y///'///e///yu//ja//";
	Результат = "";
	Для Сч = 1 по СтрДлина(СтрокаТекста) Цикл
		Символ = Сред(СтрокаТекста, Сч, 1);
		Позиция = Найти(стрРус, Символ);
		Если Позиция = 0 Тогда
			Результат = Результат + Символ
		Иначе
			Результат = Результат + СтрЗаменить(Сред(стрEng, (Позиция - 1) * 4 + 1, 4), "/", "")
		КонецЕсли
	КонецЦикла;
	Возврат Результат
КонецФункции
...Показать Скрыть

crash-16; +1 Ответить
13. Дмитрий (RENISANS) 14.07.15 10:05
В массиве смотрится красивей


Функция ТранслитерацияНаЛатиницу(СтрокаТекста)
    стрРус = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчш­щъыьэюяєіїЄІЇ";
    стрEng = "A/B/V/G/D/E/YO/ZH/Z/I/Y/K/L/M/N/O/P/R/S/T/U/F/H/TS/CH/SH/SH­CH/Y/I//E/YU/JA/a/b/v/g/d/e/yo/zh/z/i/y/k/l/m/n/o/p/r/s/t/u/­f/h/ts/ch/sh/shch/y/i//e/yu/ja/i/i/je/I/I/JE/";
	Масс = split(стрEng,"/"); //Загоняю буквы в массив
    Результат = "";
    Для Сч = 1 по СтрДлина(СтрокаТекста) Цикл
        Символ = Сред(СтрокаТекста, Сч, 1);
        Позиция = Найти(стрРус, Символ);
        Если Позиция = 0 Тогда
            Результат = Результат + Символ
        Иначе
            Результат = Результат + Масс[Позиция - 1];
		КонецЕсли
    КонецЦикла;
    Возврат Результат
КонецФункции


Функция split(Стр, Разделитель = "|")Экспорт 
	
	МассивСтрок = Новый Массив();
	ДлинаРазделителя = СтрДлина(Разделитель);
	
	Пока Истина Цикл
		Поз = Найти(Стр, Разделитель);
		Если Поз=0 Тогда
			МассивСтрок.Добавить(Стр);
			Возврат МассивСтрок;
		КонецЕсли;
		МассивСтрок.Добавить(Лев(Стр,Поз-1));
		Стр = Сред(Стр,Поз+ДлинаРазделителя);
	КонецЦикла;
КонецФункции

...Показать Скрыть