1С 8.3 Перевод строки из Unicode в UTF-8
Данные > Примеры кода 1С > 1С 8.3 Строка, текст, буквы
Перейти в раздел примеры кода 1С 8.3:
Пример №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
// Аналог: 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;
КонецЦикла;
Результат = Результат + ХексКод;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
// Аналог: 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.Получить("Текст");
Возврат Результат;
КонецФункции
//Например "%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
комментарии
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник