gifts2017

Изменение кодировки и другие преобразования над строками

Опубликовал Александр Анисков (vandalsvq) в раздел Программирование - Инструментарий

Изменение кодировки (туда и обратно), транспортное кодирование (base64), чтение полей MIME. Без использования чтения и записи в файл, только штатными средствами 1С.

На просторах интернета можно встретить разные методы изменения кодировки строки в 1С. Но большинство советов сводятся к использованию объектов ЗаписьТекста, ЧтениеТекста (ну или XML). Что в общем то как минимум не оптимально, а в случае использования SSD в качестве основных носителей информации наносит им непоправимый вред (как известно количество циклов перезаписи конечно).

Кроме того понадобилось разбирать и читать заголовки писем не средствами 1С (и в этот раз ничего хорошего в их адрес сказать не могу). Как результат столкнулся с необходимостью разбора MIME (см. в вике), преобразования из base64 и в нее (опять таки см. в вике).

В итоге было создано два общих модуля для выполнения данных преобразованию (можно скачать во вложениях).

Общие модули могут быть внедрены в любую конфигурацию на БСП, или там где есть модуль "СтроковыеФункцииКлиентСервер" (в частности используется метод РазложитьСтрокуВМассивПодстрок), или если данный вызов "обезвредить" вообще в любую конфигурацию. И кстати данный код не сложно транслировать в 7.7.

Какие методы реализованы

  • СтрокаВBase64 - кодирование строки в формат base64 *
  • Base64ВСтроку - декодирование строки из формата base64
  • СтрокаВUTF_8 - кодирование строки в utf-8
  • UTF_8ВСтроку - декодирование строки из формата utf-8
  • MIMEВСтроку - декодирование строки из формата MIME (с учетом преобразования и кодировки)
  • СтрокаВMIME - кодирование строки в формат MIME (с учетом преобразования и кодировки)
  • ДекодироватьСтроку - декодирование строки (с указанием исходной кодировки)
  • ЗакодироватьСтроку - кодирование строки (с указанием результирующей кодировки)

* Поскольку в исходных строках может быть кирилица, рекомендуется сначала переводить в utf-8. Латиница может кодироваться напрямую.

Допустимые кодировки

Также для общего развития можно почитать вот эту статью в любимой вике.

Рекомендации: оба общих модуля устанавливать с признком "Клиент, Сервер, ВнешнееСоединение". Для модуля "СтроковыеФункцииСлужебныйКлиентСерверПовтИсп" добавить признак повторного использования на время сеанса.

Скачать файлы

Наименование Файл Версия Размер
СтроковыеФункцииКлиентСерверДоп.txt 93
.txt 19,62Kb
08.10.16
93
.txt 19,62Kb Скачать
СтроковыеФункцииСлужебныйКлиентСерверПовтИсп.txt 80
.txt 8,99Kb
08.10.16
80
.txt 8,99Kb Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Владимир Гусев (adhocprog) 08.01.15 02:22
Спасибо.
Сейчас потестируем :)
2. Владимир Гусев (adhocprog) 08.01.15 03:28
Какую кодировку принимает функция СтрокаВBase64 в качестве параметра?
3. Александр Анисков (vandalsvq) 09.01.15 10:44
(2) adhocprog, кодировка не имеет значения. Можешь передавать что utf-8 строку.
Например: заголовки e-mail кодированы в base64, при этом исходная строка может быть koi-8r или utf-8.
Вроде так. Если вдруг я не прав, поправьте.
4. Максим Иванов (freud) 29.07.15 08:58
подскажите как быть с кодировкой CP1251 → CP866 ???
5. Александр Анисков (vandalsvq) 29.07.15 12:04
(4) freud, декодировать строку из 1251, потом закодировать в 866 не помогает?
6. Владимир Иванов (ogre2007) 01.02.16 22:08
Отлично написаны модули, но не работают, "то ли лыжи, то ли я"...
Берем строку: "РџРѕРїРѕРІ".
Онлайн декодировщик (декодер1 или декодер2) определяет текст "Попов" и кодировки "CP1251 → UTF-8".
А с вашими модулями, я что только не творил... По смыслу нужно использовать:
ДекодироватьСтроку(Объект.СтрокаДляПреобразования,"windows-1251");
//благо мы знаем, что это windows-1251

И ваша функция на выходе дает тот же результат: "РџРѕРїРѕРІ".
Подскажете, "где собака зарыта"?
8. Chungiri Lee (ChunLee) 04.09.16 16:45
(6) ogre2007, Результат=ДекодироватьСтроку(Объект.СтрокаДляПреобразования,"windows-1251");
Вот так надо писать
9. Chungiri Lee (ChunLee) 04.09.16 16:52
(5) vandalsvq, скачал вашу обработку, чтобы выполнить следующую операцию.
Строку преобразовать в base64.
Исходная строка ">ґ‚ћIbЦAвGcЁчl•Џќ~o¶"
должно получиться "PrSCnkli1kHiR2Oo92yVj51+b7Y="
увы не получается.
написал следующий код
Результат=СтроковыеФункцииКлиентСерверДоп.Base64ВСтроку(Значение);
подскажите если сделал что-то не то.
10. Александр Анисков (vandalsvq) 04.09.16 20:48
(9) ChunLee, в base64 или из? попробуй итоговую строку закодируй, сравни результат. И ещё если данные из поля формы, они могут быть ошибочными.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа