Unicode decode
Теги: 1С,unicode

Декодирует русские символы в юникоде (UnicodeEncode) и любые символы в юникоде (UnicodeEncode2, исп. вспом. ф-ю ПереводЧислаИз16в10)

# Код реализации

```1c
Функция UnicodeEncode(Строка) Экспорт

	Результат = Строка;

	СписокСимволов = Новый СписокЗначений;
	СписокСимволов.Добавить("\u0430", "а");
	СписокСимволов.Добавить("\u0431", "б");
	СписокСимволов.Добавить("\u0432", "в");
	СписокСимволов.Добавить("\u0433", "г");
	СписокСимволов.Добавить("\u0434", "д");
	СписокСимволов.Добавить("\u0435", "е");
	СписокСимволов.Добавить("\u0451", Символ(1105));
	СписокСимволов.Добавить("\u0436", "ж");
	СписокСимволов.Добавить("\u0437", "з");
	СписокСимволов.Добавить("\u0438", "и");
	СписокСимволов.Добавить("\u0439", "й");
	СписокСимволов.Добавить("\u043a", "к");
	СписокСимволов.Добавить("\u043b", "л");
	СписокСимволов.Добавить("\u043c", "м");
	СписокСимволов.Добавить("\u043d", "н");
	СписокСимволов.Добавить("\u043e", "о");
	СписокСимволов.Добавить("\u043f", "п");
	СписокСимволов.Добавить("\u0440", "р");
	СписокСимволов.Добавить("\u0441", "с");
	СписокСимволов.Добавить("\u0442", "т");
	СписокСимволов.Добавить("\u0443", "у");
	СписокСимволов.Добавить("\u0444", "ф");
	СписокСимволов.Добавить("\u0445", "х");
	СписокСимволов.Добавить("\u0446", "ц");
	СписокСимволов.Добавить("\u0447", "ч");
	СписокСимволов.Добавить("\u0448", "ш");
	СписокСимволов.Добавить("\u0448", "щ");
	СписокСимволов.Добавить("\u044a", "ъ");
	СписокСимволов.Добавить("\u044b", "ы");
	СписокСимволов.Добавить("\u044c", "ь");
	СписокСимволов.Добавить("\u044d", "э");
	СписокСимволов.Добавить("\u044e", "ю");
	СписокСимволов.Добавить("\u044f", "я");

	СписокСимволов.Добавить("\u0410", "А");
	СписокСимволов.Добавить("\u0411", "Б");
	СписокСимволов.Добавить("\u0412", "В");
	СписокСимволов.Добавить("\u0413", "Г");
	СписокСимволов.Добавить("\u0414", "Д");
	СписокСимволов.Добавить("\u0415", "Е");
	СписокСимволов.Добавить("\u0401", Символ(1025));
	СписокСимволов.Добавить("\u0416", "Ж");
	СписокСимволов.Добавить("\u0417", "З");
	СписокСимволов.Добавить("\u0418", "И");
	СписокСимволов.Добавить("\u0419", "Й");
	СписокСимволов.Добавить("\u041a", "К");
	СписокСимволов.Добавить("\u041b", "Л");
	СписокСимволов.Добавить("\u041c", "М");
	СписокСимволов.Добавить("\u041d", "Н");
	СписокСимволов.Добавить("\u041e", "О");
	СписокСимволов.Добавить("\u041f", "П");
	СписокСимволов.Добавить("\u0420", "Р");
	СписокСимволов.Добавить("\u0421", "С");
	СписокСимволов.Добавить("\u0422", "Т");
	СписокСимволов.Добавить("\u0423", "У");
	СписокСимволов.Добавить("\u0424", "Ф");
	СписокСимволов.Добавить("\u0425", "Х");
	СписокСимволов.Добавить("\u0426", "Ц");
	СписокСимволов.Добавить("\u0427", "Ч");
	СписокСимволов.Добавить("\u0428", "Ш");
	СписокСимволов.Добавить("\u0428", "Щ");
	СписокСимволов.Добавить("\u042a", "Ъ");
	СписокСимволов.Добавить("\u042b", "Ы");
	СписокСимволов.Добавить("\u042c", "Ь");
	СписокСимволов.Добавить("\u042d", "Э");
	СписокСимволов.Добавить("\u042e", "Ю");
	СписокСимволов.Добавить("\u042f", "Я");


	СписокСимволов.Добавить("\u0022", "'");

	СписокСимволов.Добавить("\u003E", ">");
	СписокСимволов.Добавить("\u003е", ">");

	СписокСимволов.Добавить("\u003C", "<");
	СписокСимволов.Добавить("\u003c", "<");

	Для Каждого текЭлемент Из СписокСимволов Цикл

		Результат = СтрЗаменить(Результат,текЭлемент.Значение, текЭлемент.Представление);

	КонецЦикла;

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

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

Функция UnicodeEncode2(Строка) Экспорт
    Результат = "";
    Попытка
        //регулярное выражение

        Колекция = Новый Массив; //РегВыр.Execute(Строка);
        Для Каждого Элемент Из Колекция Цикл
            Если СтрДЛина(Элемент.value) = 1 Тогда
                Продолжить;
            КонецЕсли;

            КодСимвола = ПереводЧислаИз16в10(Сред(ВРег(Элемент.value), 2));
            Символ = Символ(КодСимвола);
            Строка = СтрЗаменить(Строка, "\" + Элемент.value, Символ);
        КонецЦикла;
        Результат = Строка; //СтрЗаменить(Строка, "<br \/>", "");
    Исключение
        Результат = Строка;
        Сообщить("Ошибка преобразования из Unicode", СтатусСообщения.Информация);
    КонецПопытки;

    Возврат Результат;
КонецФункции

Функция ПереводЧислаИз16в10(Знач Значение)

	    	СтруктураЧисел = Новый Соответствие;
		СтруктураЧисел.Вставить("0", 0);
		СтруктураЧисел.Вставить("1", 1);
		СтруктураЧисел.Вставить("2", 2);
		СтруктураЧисел.Вставить("3", 3);
		СтруктураЧисел.Вставить("4", 4);
		СтруктураЧисел.Вставить("5", 5);
		СтруктураЧисел.Вставить("6", 6);
		СтруктураЧисел.Вставить("7", 7);
		СтруктураЧисел.Вставить("8", 8);
		СтруктураЧисел.Вставить("9", 9);
		СтруктураЧисел.Вставить("A", 10);
		СтруктураЧисел.Вставить("B", 11);
		СтруктураЧисел.Вставить("C", 12);
		СтруктураЧисел.Вставить("D", 13);
		СтруктураЧисел.Вставить("E", 14);
		СтруктураЧисел.Вставить("F", 15);


	    Результат = 0;

	    //перевод значения в строку

	    Если ТипЗнч(Значение) <> Тип("Строка") Тогда
	        Значение = СокрЛП(Строка(Значение));
	    КонецЕсли;

	    МаксРазрядЦелых = 0;
	    МаксРазрядЦелых = СтрДлина(Значение) - 1;

	    н = МаксРазрядЦелых;
	    Ин = 1;
	    Пока н >= 0 Цикл
	        ТекЗначение = СтруктураЧисел.Получить(Сред(Значение, Ин, 1)) * Pow(16, н);
	        Результат = Результат + ТекЗначение;
	        н = н - 1;
	        Ин = Ин + 1;
	    КонецЦикла;

	    Возврат Результат;
	КонецФункции
```

# Примечания

- Чуть более короткая функция перевода числа из 16'тиричной системы в 10'тиричную.
Функция ПереводЧислаИз16в10(Знач Число16)
	Цифры16 = "0123456789ABCDEF";
	Результат = 0;
	Для Сч = 1 По СтрДлина(Число16) Цикл
		Цифра10 = СтрНайти(Цифры16, Сред(Число16, Сч, 1)) - 1;
		Результат = Результат * 16 + Цифра10;
	КонецЦикла;	
	Возврат Результат;
КонецФункции

- Ещё чуть более короткая функция перевода числа из 16'теричной системы в 10'теричную.
Функция ПереводЧислаИз16в10(Знач Число16)
	Возврат ЧислоИзШестнадцатеричнойСтроки("0x" + Число16)
КонецФункции

Есть платформенная функция ЧислоИзШестнадцатеричнойСтроки (начиная с версии 8.3.10).

- Чуть более короткая функция UnicodeEncode.
Функция UnicodeEncode(Строка)
	ЧтениеJSON = Новый ЧтениеJSON;
	ЧтениеJSON.УстановитьСтроку("""" + Строка + """");
	Возврат ПрочитатьJSON(ЧтениеJSON)
КонецФункции

(Объект ЧтениеJSON есть начиная с версии 8.3.6.)