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

При отправке 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)))
КонецЦикла;

Возврат ВРЕГ(НовоеСлово);
КонецФункции

18 Comments

  1. anddro

    а через массив не быстрее?

    Примерно так:

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

    Процедура ДобавитьСимвол(Символ,ВСимвол)

    транслит[КодСимв(Символ) + 1] = ВСимвол;

    Если Врег(Символ) <> Символ Тогда

    транслит[КодСимв(ВРЕГ(Символ)) + 1] = ВРЕГ(Лев(ВСимвол,1))+Сред(ВСимвол,2);

    КонецЕсли;

    КонецПроцедуры

    Функция ЗаполнитьТранслит();

    Для Сч = 1 По 256 Цикл

    транслит[сч] = Симв(сч-1);

    КонецЦикла;

    ДобавитьСимвол(«й»,»j»);

    //.. и т.п. — только маленькие, и только то что надо транслитерировать

    ДобавитьСимвол(«щ»,»tsh»);

    КонецФункции

    //*******************************************

    Процедура Сформировать()

    ЗаполнитьТранслит();

    Стр = «?????????????»;

    РезСтр = «»;

    Для Сч = 1 По СтрДлина(Стр) Цикл

    РезСтр = РезСтр + транслит[КодСимв(Сред(Стр,Сч,1)) + 1];

    КонецЦикла;

    КонецПроцедуры

    Reply
  2. Арчибальд

    Что-то близкое

    http://infostart.ru/public/57742/

    Reply
  3. NoMax

    (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;

    КонецФункции

    Reply
  4. NoMax
  5. serg1c

    А почему не использовать посылку сразу латиницей но в UNICODE.

    Например: http://infostart.ru/public/16088/

    Reply
  6. kiros

    Спасибо, мне пригодилось при создании пользователя в 1с8 почту писать, немного подшаманил, т.к. 8-ка и 7-ка все таки немного разные :). А так спасибо, просто и понятно.

    Reply
  7. air_mike

    (7) kiros, Аналогично. т.к. регистры важны

    Reply
  8. igorberezhnov

    Очень быстрая функция транслитерации. Работает с символами как верхнего, так и нижнего регистра. Встречающиеся латинские буквы и знаки препинания оставляет нетронутыми.

    // Глобальная переменная
    Перем ТрансХ[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,НРег(С),С);
    Иначе Р=Р+С;
    КонецЕсли;
    КонецЦикла;
    Возврат Р;
    КонецФункции

    Показать

    Reply
  9. RTFM

    Спасибо автору! Самому впадлу было бы писать. Чуть под себя переделал.

    Reply
  10. Masich

    (9)

    Толково!

    Reply
  11. lamp

    Вставлю и свои 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), «/», «»)
    КонецЕсли
    КонецЦикла;
    Возврат Результат
    КонецФункции

    Показать

    Reply
  12. RENISANS

    В массиве смотрится красивей

    Функция ТранслитерацияНаЛатиницу(СтрокаТекста)
    стрРус = «АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчш­щъыьэюяєіїЄІЇ»;
    стр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));
    Стр = Сред(Стр,Поз+ДлинаРазделителя);
    КонецЦикла;
    КонецФункции
    
    

    Показать

    Reply
  13. 🅵🅾️🆇

    Некропостну своей функцией по госту 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
    Reply
  14. 🅵🅾️🆇

    (14)

    Быстрофикс, должно быть ТРег:

    // Символы в верхнем регистре
    Буква    = ТРег(Соответсвие[НРег(Буква)]);
    
    Reply
  15. Cooler

    (14)

    Некропостну своей функцией

    Получился не только некропостинг, но и мимопостинг: публикация находится в разделе «Платформа 7.7».

    Reply
  16. 🅵🅾️🆇

    (16)

    Прошу прощения. Существование семерки уже стерлось из памяти.

    Reply
  17. Running

    Спасибо за простой и понятный код.

    Reply
  18. balanton

    (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;
    КонецФункции

    Показать

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *