Функция EncodeUTF8(Текст)
Позиция = 1;
Длина = СтрДлина(Текст);
Результат = Новый Массив;
Пока Позиция <= Длина Цикл
Смещение = Ложь;
КодСимвола = КодСимвола(Текст, Позиция);
Позиция = Позиция + 1;
Если КодСимвола < 128 Тогда
Результат.Добавить(КодСимвола);
ИначеЕсли КодСимвола < 2048 Тогда
Результат.Добавить(ПобитовоеИли(192, ПобитовыйСдвигВправо(КодСимвола, 6)));
Результат.Добавить(ПобитовоеИли(128, ПобитовоеИ(КодСимвола, 63)));
ИначеЕсли КодСимвола >= 55296 И КодСимвола <= 57343 Тогда
КодоваяПозиция = -1;
КодСимвола2 = 0;
Если КодСимвола >= 55296 И КодСимвола < 56320 И Позиция < Длина Тогда
КодСимвола2 = КодСимвола(Текст, Позиция);
Если КодСимвола2 >= 56320 И КодСимвола2 < 57344 Тогда
КодоваяПозиция = (ПобитовыйСдвигВлево(КодСимвола, 10) + КодСимвола2) + (65536 - (ПобитовыйСдвигВлево(55296, 10)) - 56320);
КонецЕсли;
КонецЕсли;
Если КодоваяПозиция < 0 Тогда
ВызватьИсключение "Неизвестный символ";
Иначе
Результат.Добавить(ПобитовоеИли(240, ПобитовыйСдвигВправо(КодоваяПозиция, 18)));
Результат.Добавить(ПобитовоеИли(128, ПобитовоеИ(ПобитовыйСдвигВправо(КодоваяПозиция, 12), 63)));
Результат.Добавить(ПобитовоеИли(128, ПобитовоеИ(ПобитовыйСдвигВправо(КодоваяПозиция, 6), 63)));
Результат.Добавить(ПобитовоеИли(128, ПобитовоеИ(КодоваяПозиция, 63)));
Позиция = Позиция + 1;
КонецЕсли;
Иначе
Результат.Добавить(ПобитовоеИли(224, ПобитовыйСдвигВправо(КодСимвола, 12)));
Результат.Добавить(ПобитовоеИли(128, ПобитовоеИ(ПобитовыйСдвигВправо(КодСимвола, 6), 63)));
Результат.Добавить(ПобитовоеИли(128, ПобитовоеИ(КодСимвола, 63)));
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции |