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

02.10.09

Разработка - Универсальные функции

При отправке 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С: Предприятие 7.7"

Универсальные функции Платформа 1С v7.7 Россия Абонемент ($m)

В библиотеку собраны различные функции по работе с документами, журналами, типами данных, строками, датой и временем, таблицами значений, Excel, файлами, XML, JSON, Http-сервисами, SMTP серверами и т.п.

1 стартмани

22.12.2023    657    9    user706545_kseg1971    0    

4

1С 7.7 и новый 1С:Контрагент

Универсальные функции Платформа 1С v7.7 Конфигурации 1cv7 Россия Бесплатно (free)

Получение реквизитов контрагентов из 1С:Контрагент для старых конфигураций под 1с 7.7.

25.04.2022    1820    zhenyat    7    

6

Печать таблицы значений в 1С 7.7 при отладке

Универсальные функции Платформа 1С v7.7 Россия Бесплатно (free)

Функция выводит таблицу значений в табличный документ. (v7.7) Особенно полезно при отладке. Не нужно вносить изменения в код, вызываем функцию как вычисляемое выражение при останове. Если таблица обрабатывается в несколько этапов, можно вывести её после каждого и визуально проследить эволюцию.

30.06.2021    4399    Zoltan_Black    11    

2

Установка принтера по умолчанию для 1С 7.7

Универсальные функции Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Установка принтера по умолчанию в 1С 7.7. Обработка может быть полезна в том случае, когда нужно установить принтер по умолчанию, а доступа к рабочему столу нет (например, терминальный режим без рабочего стола или remoteApp)

1 стартмани

13.02.2019    13286    4    alsen    3    

4

Формирование строки json в 1С: 7.7

Универсальные функции Платформа 1С v7.7 Конфигурации 1cv7 1С:Комплексная 7.7 Абонемент ($m)

Предлагается набор функций 1с 7.7 для формирования строки json стандартными средствами.

1 стартмани

10.12.2018    10094    malovandrey    2    

18

Как создать индикатор в 1С:Предприятии 7.7

Универсальные функции Работа с интерфейсом Платформа 1С v7.7 Конфигурации 1cv7 Россия Абонемент ($m)

В статье дано описание создания индикатора на форме в среде разработки 1С:Предприятие 7.7 исключительно типовыми средствами.

1 стартмани

27.09.2016    18672    2    HAMMER_59    6    

2
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. anddro 84 02.10.09 12:44 Сейчас в теме
а через массив не быстрее?
Примерно так:

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

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

Функция ЗаполнитьТранслит();
Для Сч = 1 По 256 Цикл
транслит[сч] = Симв(сч-1);
КонецЦикла;
ДобавитьСимвол("й","j");
//.. и т.п. - только маленькие, и только то что надо транслитерировать
ДобавитьСимвол("щ","tsh");
КонецФункции
//*******************************************
Процедура Сформировать()
ЗаполнитьТранслит();
Стр = "?????????????";
РезСтр = "";
Для Сч = 1 По СтрДлина(Стр) Цикл
РезСтр = РезСтр + транслит[КодСимв(Сред(Стр,Сч,1)) + 1];
КонецЦикла;
КонецПроцедуры
2. Арчибальд 2706 02.10.09 15:04 Сейчас в теме
3. NoMax 232 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;
КонецФункции
taterm; EarlyBird; Papilion; arccos6pi; pchelkatoo; lamp; Hellen; orehova123; LiliaYA; Redpirate; +10 Ответить
19. balanton 308 21.11.19 22:42 Сейчас в теме
(3) все преобразует в верхний регистр. немного модифицировал

Функция 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_or = Сред(srtRusWord, i,1);
		s = ВРег(s_or);
		k = Найти(strRUS, s);
		Если k = 0 тогда
			curS = s;
		Иначе
			curS = СтрЗаменить(Сред(strENG, (k - 1) * 4 + 1, 4), "/", "");
		КонецЕсли;
		Если s <> s_or Тогда
			curS = НРег(curS);
		КонецЕсли;
		strResult = strResult + curS;
	КонецЦикла ;
	Возврат strResult;
КонецФункции
Показать
5. serg1c 23 07.10.09 10:44 Сейчас в теме
А почему не использовать посылку сразу латиницей но в UNICODE.
Например: http://infostart.ru/public/16088/
6. пользователь 03.11.11 21:12
Сообщение было скрыто модератором.
...
7. kiros 52 17.01.12 11:33 Сейчас в теме
Спасибо, мне пригодилось при создании пользователя в 1с8 почту писать, немного подшаманил, т.к. 8-ка и 7-ка все таки немного разные :). А так спасибо, просто и понятно.
8. air_mike 25 24.01.12 09:11 Сейчас в теме
(7) kiros, Аналогично. т.к. регистры важны
9. 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,НРег(С),С);
	Иначе Р=Р+С;
	КонецЕсли;
	КонецЦикла;
	Возврат Р;
КонецФункции
Показать
dim9; lamp; +2 Ответить
11. Masich 15.10.13 23:07 Сейчас в теме
10. sazol 84 18.06.13 11:25 Сейчас в теме
Спасибо автору! Самому впадлу было бы писать. Чуть под себя переделал.
12. lamp 29 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), "/", "")
		КонецЕсли
	КонецЦикла;
	Возврат Результат
КонецФункции
Показать

birk; terra_inc; dim9; crash-16; +4 Ответить
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));
		Стр = Сред(Стр,Поз+ДлинаРазделителя);
	КонецЦикла;
КонецФункции

Показать
user1985542; avgreen; bluntschi; FilatovRA; dim9; +5 Ответить
14. 🅵🅾️🆇 522 04.10.17 14:03 Сейчас в теме
Некропостну своей функцией по госту ISO 9:

// ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~
//		Транслитерация согласно ГОСТ'у 7.79—2000 / ISO 9 
// ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~
// Транслитерация с русского согласно ISO 9
// Функция возвращает транслит текстом соблюдая изначальный регистр.
// Параметры:
//	Текст	- [обязательный](строка) параметром передается текст на транслитерацию
//	Правило	- [необязательный](строка) правило CSV строкой с разделителями ":" и ";"
Функция TransliteracziyaISO9(Знач Текст, Знач Правило = "")
	// Устанавливаю соответсвия между русскими символами и латиницей
	Если ПустаяСтрока(Правило) Тогда 
		Правило		= 
		"А:a;Б:b;В:v;Г:g;Д:d;Е:e;Ё:yo;Ж:zh;З:z;И:i;Й:j;К:k;
		|Л:l;М:m;Н:n;О:o;П:p;Р:r;С:s;Т:t;У:u;Ф:f;Х:x;Ц:cz;
		|Ч:ch;Ш:sh;Щ:shh;Ъ:``;Ы:y`;Ь:`;Э:e`;Ю:yu;Я:ya;’:';№:#";
	КонецЕсли;
	Правило		= СтрЗаменить(Правило, Символы.ПС, "");	
	Соответсвие	= Новый Соответствие; 
	Для Каждого Элт Из СтрРазделить(Правило, ";", Ложь) Цикл
		Соответсвие.Вставить(НРег(Лев(Элт, 1)), НРег(Сред(Элт, 3)));	
	КонецЦикла;
	Результат	= "";
	Правило		= Неопределено;
	
	// Перебираю посимвольно исходный текст
	Для Счетчик = 1 По СтрДлина(Текст) Цикл
		Буква	= Сред(Текст, Счетчик, 1);
		Если Соответсвие[НРег(Буква)] = Неопределено  Тогда
			// Оставлять нетронутыми исходные символы
			Буква	= Буква;	
		ИначеЕсли Буква = НРег(Буква) Тогда
			// Символы в нижнем регистре
			Буква	= Соответсвие[Буква];
		Иначе
			// Символы в верхнем регистре
			Буква	= ВРег(Соответсвие[НРег(Буква)]);
		КонецЕсли;		
		Результат	= Результат + Буква;
	КонецЦикла;	
	Возврат Результат;
КонецФункции // TransliteracziyaISO9()
// ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~
Показать


Pri otpravke SMSok iz 1S stolknulsya s tem, chto tekst otpravlyalsya tol`ko latiniczej, a danny`e-to v kirillicze. V rezul`tate napisal funkcziyu perevoda teksta v latiniczu.
Mozhet, komu-nibud` prigoditsya
15. 🅵🅾️🆇 522 04.10.17 17:14 Сейчас в теме
(14)
Быстрофикс, должно быть ТРег:
// Символы в верхнем регистре
Буква    = ТРег(Соответсвие[НРег(Буква)]);
16. Cooler 22 04.10.17 17:25 Сейчас в теме
(14)
Некропостну своей функцией
Получился не только некропостинг, но и мимопостинг: публикация находится в разделе "Платформа 7.7".
17. 🅵🅾️🆇 522 04.10.17 17:48 Сейчас в теме
(16)
Прошу прощения. Существование семерки уже стерлось из памяти.
18. Running 03.12.18 10:52 Сейчас в теме
Спасибо за простой и понятный код.
Оставьте свое сообщение