Open sergey-s-betke opened 7 years ago
Итак, пришла в голову идея построить эту подсистему на базе XSLT в 1С. Необходимо ещё разобраться с версией XSLT в 1С. Хватит и 1.0, но 2.0 куда лучше (есть поддержка регулярных выражений).
Алгоритм реализации вижу следующий:
<char code="123" category="" .../>
- со всеми свойствами символа из UnicodeData в атрибутах элемента. С этим преобразованием пока тоже не всё ясно. Видимо, самым простым для 1С будет загрузка UnicodeData в справочник, и либо посимвольные запросы к этому справочнику (что совсем плохо на мой взгляд), либо загрузка исходного потока во временную таблицу с упорядочиванием в порядке следования в потоке и объединение с созданным справочником UnicodeData.В итоге, должны получить систему, на вход которой мы отдаём строку, на выходе - структуру 1С или исключение.
Пойдём по порядку. Преобразование Unicode16 (строки 1С) в Unicode32. Удастся ли и для этих целей использовать XSLT, или придётся писать код на 1С для этих целей? Записать как текстовый файл, так и XML в UTF-32 1С вполне может. Результат стоит тестировать. Но можно ли избежать записи в файл и обойтись операциями в памяти?..
Если забыть про кроссплатформенность, можно и .dotNet использовать:
Текст = Новый COMОбъект("System.Text.UTF8Encoding");
КриптоSHA256 = Новый COMОбъект("System.Security.Cryptography.HMACSHA256");
КриптоSHA256.key = Текст.GetBytes_4(Ключ);
Если ВернутьBase64 Тогда
Хэш256 = КриптоSHA256.ComputeHash_2(Текст.GetBytes_4(Строка)).Выгрузить();
СтрокаХэша = Преобразовать64(, Хэш256);
Иначе
Хэш256 = КриптоSHA256.ComputeHash_2(Текст.GetBytes_4(Строка));
оStr = Новый COMОбъект("System.Text.StringBuilder");
Для Каждого стр Из Хэш256 Цикл
оStr.AppendFormat("{0:x02}", стр);
КонецЦикла;
СтрокаХэша = оStr.ToString; //последовательность байтов
КонецЕсли;
Возврат СтрокаХэша;
Можно и с потоками в памяти. С любыми потоками. ЗаписьТекста.Открыть
, ЧтениеТекста.Открыть
. Строкой указываем кодировку - и всё в порядке. На первый взгляд.
Итак, таким образом мы попробуем конвертировать UTF16 (строки 1С) в UTF32. А далее - уже сравнение...
Ещё можно на Windows использовать через COM System.Char
. Но не кроссплатформенно.
Преобразовать символы в коды символов в XSLT 1.0 невозможно.
Отдать лексическому анализатору нам надо что-то типа:
<?xml version="1.0" encoding="UTF-8"?>
<строка>
<символ текст="к" код="" категория="буквы"/>
<символ текст="г" код="" категория="буквы"/>
<символ текст=" " код="" категория="разделители"/>
<символ текст="*" код="" категория="операции"/>
<символ текст="м" код="" категория="буквы"/>
<символ текст="/" код="" категория="операции"/>
<символ текст="с" код="" категория="буквы"/>
<символ текст="^" код="" категория="операции"/>
<символ текст="2" код="" категория="буквы"/>
</строка>
со всеми данными из UnicodeData.
Эта задача нужна и для #67. Да и не только.