1С 8.3 Перевод строки из Unicode в UTF-8 - Программист 1С Минск. Автоматизация бизнеса.

Перейти к контенту

1С 8.3 Перевод строки из Unicode в UTF-8

Данные > Примеры кода 1С > 1С 8.3 Строка, текст, буквы
Примеры функций, которые корректно преобразуют в 1С 8.3 строку из Unicode в UTF-8. Используется вспомогательная функция Dec_to_Hex (перевод десятичного числа в шестнадцатеричное).

Пример №1 Конвертация строки из Unicode в UTF-8 (более оптимизирован от пользователя Ruffer1C) в 1С 8.3:
Функция Dec_to_Hex(Знач пDec, Знач Разрядность = 2)
   // Аналог: https://koder.by/perevod_desjatichnogo_chisla_v_shestnadcaterichnoe.php

   Если Разрядность = 2 Тогда
       Возврат Сред(ПредставлениеHex, пDec * 2 + 1, 2);
   КонецЕсли;

   пHex = "0123456789ABCDEF";
   Результат = "";

   Для СимвЧисло = 1 По Разрядность Цикл
       ТекЧисло = пDec % 16;
       пDec = Цел(пDec / 16);
       Результат = Сред(пHex, ТекЧисло + 1, 1) + Результат;
   КонецЦикла;

   Возврат Результат;

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


Функция ПереводТекстаUnicodeToUTF8(СтрокаДляКодировки)

   ПредставлениеHex = "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2
E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60616263646566
6768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E
9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECF
D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF";
  // ВНИМАНИЕ! При вставке в 1С из переменной ПредставлениеHex удалить переносы (перенесены для отображения на странице)

   СимволыДляИсключения = "-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~";
   Результат = "";

   Для а = 1 По СтрДлина(СтрокаДляКодировки) Цикл
       ТекСимв = Сред(СтрокаДляКодировки, а, 1);

       Если ТекСимв = " " Тогда
           Результат = Результат + "+";
           Продолжить;
       КонецЕсли;

       Если Найти(СимволыДляИсключения, ТекСимв) > 0 Тогда
           Результат = Результат + ТекСимв;
           Продолжить;
       КонецЕсли;

       ЮниКод = КодСимвола(ТекСимв);
       Если ЮниКод < 128 Тогда
           Результат = Результат + "%" + Dec_to_Hex(ЮниКод, ПредставлениеHex);
       Иначе
           ИндексЮникод = 32;
           Байт = 8;
           ХексКод = "";
           Пока ИндексЮникод > 4 Цикл
               // установка следующих за первым байтов
               ТекБайт = ЮниКод % 64;
               ХексКод = "%" + Dec_to_Hex(128 + ТекБайт, ПредставлениеHex) + ХексКод;

               ЮниКод        = Цел(ЮниКод / 64);
               // проверка на закрывающий байт
               Если ЮниКод < ИндексЮникод Тогда
                   ХексКод = "%" + Dec_to_Hex((Байт-2) * ИндексЮникод + ЮниКод, ПредставлениеHex) + ХексКод;
                   Прервать;
               КонецЕсли;
               // переход к следующему уровню закрытия
               ИндексЮникод = ИндексЮникод / 2;
               Байт = Байт * 2;
           КонецЦикла;
           Результат = Результат + ХексКод;
       КонецЕсли;
   КонецЦикла;

   Возврат Результат;
КонецФункции
Пример №2 Конвертация строки из Unicode в UTF-8 (от пользователя Ruffer1C) в 1С 8.3:
Функция Dec_to_Hex(Знач пDec, Знач Разрядность = 2)
   // Аналог: https://koder.by/perevod_desjatichnogo_chisla_v_shestnadcaterichnoe.php

   пHex = "0123456789ABCDEF";
   Результат = "";

   Для СимвЧисло = 1 По Разрядность Цикл
       ТекЧисло = пDec % 16;
       пDec = Цел(пDec / 16);
       Результат = Сред(пHex, ТекЧисло + 1, 1) + Результат;
   КонецЦикла;

   Возврат Результат;

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


Функция ПереводТекстаUnicodeToUTF8(СтрокаДляКодировки)

   СимволыДляИсключения = "-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~";
   Результат = "";

   Для а = 1 По СтрДлина(СтрокаДляКодировки) Цикл
       ТекСимв = Сред(СтрокаДляКодировки, а, 1);

       Если ТекСимв = " " Тогда
           Результат = Результат + "+";
           Продолжить;
       КонецЕсли;
       Если Найти(СимволыДляИсключения, ТекСимв) > 0 Тогда
           Результат = Результат + ТекСимв;
           Продолжить;
       КонецЕсли;

       ЮниКод = КодСимвола(ТекСимв);
       Если ЮниКод < 128 Тогда
           Результат = Результат + "%" + Dec_to_Hex(ЮниКод);
       Иначе
           ИндексЮникод = 32;
           Байт = 8;
           ХексКод = "";
           Пока ИндексЮникод > 4 Цикл
               // установка следующих за первым байтов
               ТекБайт = ЮниКод % 64;
               ХексКод = "%" + Dec_to_Hex(128 + ТекБайт) + ХексКод;

               ЮниКод        = Цел(ЮниКод / 64);
               // проверка на закрывающий байт
               Если ЮниКод < ИндексЮникод Тогда
                   ХексКод = "%" + Dec_to_Hex((Байт-2) * ИндексЮникод + ЮниКод) + ХексКод;
                   Прервать;
               КонецЕсли;
               // переход к следующему уровню закрытия
               ИндексЮникод = ИндексЮникод / 2;
               Байт = Байт * 2;
           КонецЦикла;
           Результат = Результат + ХексКод;
       КонецЕсли;
   КонецЦикла;

   Возврат Результат;
КонецФункции
Пример №3 Преобразовать UNICODE ответ с Сайта (автор ProxyInspector) в 1С 8.3:
//Отдельные сайты шлют ответы в перемешку UTF-16 и UTF-8
//Например         "%u0411F%20%33А trial"
//Надо сделать     "%u0411F%u0020%u0033А trial"
Функция Dec_to_Hex(СтрокаДляКодировки) Экспорт

   СтрокаUnicode = "";

   МассивПодстрок = СтрРазделить(СтрокаДляКодировки,"%",Ложь);
   Для Каждого Подстрока Из МассивПодстрок Цикл
       Если Сред(Подстрока,1,1) = "u" Тогда //Это UTF-16
           СтрокаUnicode = СтрокаUnicode + "%" + Подстрока;
           Продолжить;
       Иначе //Это UTF-8
           ПервыеДваСимвола = Сред(Подстрока,1,2);
           ПоследниеСимволы = Сред(Подстрока,3);
           Подстрока = "u00" + ПервыеДваСимвола + ПоследниеСимволы;
           СтрокаUnicode = СтрокаUnicode + "%" + Подстрока;
       КонецЕсли;
   КонецЦикла;

   СтрокаUnicode  = СтрЗаменить(СтрокаUnicode,"%","\"); //Подготовим для JSON

   ЧтениеJSON = Новый ЧтениеJSON;
   Стр = "{""Текст"":"""+СтрокаUnicode + """}";
   ЧтениеJSON.УстановитьСтроку(Стр);

   JSON    =  ПрочитатьJSON(ЧтениеJSON, Истина);
   Результат    = JSON.Получить("Текст");

   Возврат Результат;

КонецФункции
0
комментарии
____________________
Copyright©, «Программист 1С в г.Минске», 03.11.2021
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Яндекс.Метрика
Защищенное соединение ssl
visa
mastercard
Maestro
Яндекс деньги
Назад к содержимому