Как преобразовать Unicode в 1С

Ох уж эти вечные проблемы с кодировкой…
Долго искал в инете как преобразователь Unicod. Потом все таки сам написал функцию.

Синтаксис:
ПереобразоватьЮникод()

Параметры:
(обязательный)
Тип: Строка.
Исходная строка.

Возвращаемое значение:
Тип: Строка.
Строка обработанных символов.

Описание:
Возвращает преобразованную строку из формата Unicod.

Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.

 

Функция ПереобразоватьЮникод(Строка)


ГотововаяСтрока = "" ;

МасУкр = Новый Массив(66) ;

МасУкр[0]="А";   МасУкр[1]="Б";  МасУкр[2]="В";  МасУкр[3]="Г";  МасУкр[4]="Ґ";  МасУкр[5]="Д";
МасУкр[6]="Е";   МасУкр[7]="Є";  МасУкр[8]="Ж";  МасУкр[9]="З";  МасУкр[10]="И"; МасУкр[11]="І";
МасУкр[12]="Ї";  МасУкр[13]="Й"; МасУкр[14]="К"; МасУкр[15]="Л"; МасУкр[16]="М"; МасУкр[17]="Н";
МасУкр[18]="О";  МасУкр[19]="П"; МасУкр[20]="Р"; МасУкр[21]="С"; МасУкр[22]="Т"; МасУкр[23]="У";
МасУкр[24]="Ф";  МасУкр[25]="Х"; МасУкр[26]="Ц"; МасУкр[27]="Ч"; МасУкр[28]="Ш"; МасУкр[29]="Щ";
МасУкр[30]="Ь";  МасУкр[31]="Ю"; МасУкр[32]="Я";

МасУкр[33]="а";  МасУкр[34]="б"; МасУкр[35]="в"; МасУкр[36]="г"; МасУкр[37]="ґ"; МасУкр[38]="д";
МасУкр[39]="е";  МасУкр[40]="є"; МасУкр[41]="ж"; МасУкр[42]="з"; МасУкр[43]="и"; МасУкр[44]="і";
МасУкр[45]="ї";  МасУкр[46]="й"; МасУкр[47]="к"; МасУкр[48]="л"; МасУкр[49]="м"; МасУкр[50]="н";
МасУкр[51]="о";  МасУкр[52]="п"; МасУкр[53]="р"; МасУкр[54]="с"; МасУкр[55]="т"; МасУкр[56]="у";
МасУкр[57]="ф";  МасУкр[58]="х"; МасУкр[59]="ц"; МасУкр[60]="ч"; МасУкр[61]="ш"; МасУкр[62]="щ";
МасУкр[63]="ь";  МасУкр[31]="ю"; МасУкр[65]="я";


МасКод = Новый Массив(66) ;

МасКод[0]="0410";   МасКод[1]="0411";  МасКод[2]="0412";  МасКод[3]="0413";  МасКод[4]="0490";  МасКод[5]="0414";
МасКод[6]="0415";   МасКод[7]="0404";  МасКод[8]="0416";  МасКод[9]="0417";  МасКод[10]="0418"; МасКод[11]="0406";
МасКод[12]="0407";  МасКод[13]="0419"; МасКод[14]="041A"; МасКод[15]="041B"; МасКод[16]="041C"; МасКод[17]="041D";
МасКод[18]="041E";  МасКод[19]="041F"; МасКод[20]="0420"; МасКод[21]="0421"; МасКод[22]="0422"; МасКод[23]="0423";
МасКод[24]="0424";  МасКод[25]="0425"; МасКод[26]="0426"; МасКод[27]="0427"; МасКод[28]="0428"; МасКод[29]="0429";
МасКод[30]="042C";  МасКод[31]="042E"; МасКод[32]="042F";

МасКод[33]="0430";  МасКод[34]="0431"; МасКод[35]="0432"; МасКод[36]="0413"; МасКод[37]="0491"; МасКод[38]="0434";
МасКод[39]="0435";  МасКод[40]="0454"; МасКод[41]="0436"; МасКод[42]="0437"; МасКод[43]="0438"; МасКод[44]="0456";
МасКод[45]="0457";  МасКод[46]="0439"; МасКод[47]="043A"; МасКод[48]="043B"; МасКод[49]="043C"; МасКод[50]="043D";
МасКод[51]="043E";  МасКод[52]="043F"; МасКод[53]="0440"; МасКод[54]="0441"; МасКод[55]="0442"; МасКод[56]="0443";
МасКод[57]="0444";  МасКод[58]="0445"; МасКод[59]="0446"; МасКод[60]="0447"; МасКод[61]="0448"; МасКод[62]="0449";
МасКод[63]="044C";  МасКод[31]="044E"; МасКод[65]="044F";


тмпСтрока = "" ;
Для Счетчик = 1 По СтрДлина(Строка) Цикл
Если Лев(Строка, 1) = "" Тогда
Если Лев(Строка, 2) = "u" Тогда

тмпСтрока = Прав(Лев(Строка, 6),4) ;
Если МасКод.Найти(тмпСтрока) = Неопределено Тогда
СтрокаЗамены = Прав(тмпСтрока, 1) ;
тмпСтрока = СтрЗаменить(тмпСтрока,СтрокаЗамены,ТРег(СтрокаЗамены));
Если МасКод.Найти(тмпСтрока) = Неопределено Тогда
Сообщить("Код символа не найден: " + тмпСтрока) ;
Иначе
ГотововаяСтрока = ГотововаяСтрока + МасУкр[МасКод.Найти(тмпСтрока)] ;
КонецЕсли;
Иначе
ГотововаяСтрока = ГотововаяСтрока + МасУкр[МасКод.Найти(тмпСтрока)] ;
КонецЕсли;

Строка = Прав(Строка, (СтрДлина(Строка)-6)) ;
Иначе
Строка = Прав(Строка, (СтрДлина(Строка)-2)) ;
КонецЕсли;
Иначе
ГотововаяСтрока = ГотововаяСтрока + Лев(Строка, 1) ;
Строка = Прав(Строка, (СтрДлина(Строка)-1)) ;
КонецЕсли;
КонецЦикла;

Возврат ГотововаяСтрока ;

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

 

14 Comments

  1. treedo

    Ох уж эти вечные проблемы с кодировкой…

    Долго искал в инете как преобразователь Unicod. Потом все таки сам написал функцию.

    Перейти к публикации

    Reply
  2. Serj1C

    А можно было так?

    Записать текстовый документ в кодировке Юникод, а потом его прочитать в кодировке Анси?

    Reply
  3. treedo

    (1) Serj1C, Нет, нельзя.

    Reply
  4. treedo

    Способ называеццо: «Против лома, нет …»

    Reply
  5. alexk-is

    Мне кажется, что следующий код будет работать побыстрее

    КлючИЗначение = Соответствие.Получить(тмпСтрока);
    Если КлючИЗначение = Неопределено Тогда
    ….
    Иначе
    ГотововаяСтрока = ГотововаяСтрока + КлючИЗначение.Значение;
    КонецЕсли;
    Reply
  6. treedo

    (4) alexk-is, Возможно, хз)

    Reply
  7. alexk-is

    (5) А здесь написано, что точно будет быстрее. 🙂

    Reply
  8. slavik27

    спасибо, хороший пример, только жалко с русскими символами нет

    Reply
  9. tolick

    Спасибо, пригодилось.

    Reply
  10. 314r
    Reply
  11. Buben-128

    Во народ жжот ))))

    Удаление зубов через противоположный проход — это круто (наверно)!

    Если «напрямую», можно так:

    //Пример строки с юникодом
    //{«NAME»:»u0421u043au0438u0434u043au0430 u043eu0442 u043cu0435u043du0435u0434u0436u0435u0440u0430 u041fu041f — 5%»,»COUPON»:»SL-4IFEJ-S4LCPZB»}
    
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(StrJason);
    Пока ЧтениеJSON.Прочитать() Цикл
    Попытка
    Сообщить(«Параметр «+ЧтениеJSON.ТекущееЗначение);
    Исключение
    КонецПопытки
    КонецЦикла;
    

    Показать

    Reply
  12. treedo

    (10) Buben-128, Статья писалась когда в платформе не было полноценной реализации JSON. Если ваш код рабочий, он намного эффективней и проще.

    Reply
  13. sevenlis
    Reply
  14. Alien_job

    (10) Спасибо, работает!

    Reply

Leave a Comment

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