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

Изменение кодировки (туда и обратно), транспортное кодирование (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. Латиница может кодироваться напрямую.

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

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

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

17 Comments

  1. adhocprog

    Спасибо.

    Сейчас потестируем 🙂

    Reply
  2. adhocprog

    Какую кодировку принимает функция СтрокаВBase64 в качестве параметра?

    Reply
  3. vandalsvq

    (2) adhocprog, кодировка не имеет значения. Можешь передавать что utf-8 строку.

    Например: заголовки e-mail кодированы в base64, при этом исходная строка может быть koi-8r или utf-8.

    Вроде так. Если вдруг я не прав, поправьте.

    Reply
  4. freud

    подскажите как быть с кодировкой CP1251 → CP866 ???

    Reply
  5. vandalsvq

    (4) freud, декодировать строку из 1251, потом закодировать в 866 не помогает?

    Reply
  6. ogre2007

    Отлично написаны модули, но не работают, «то ли лыжи, то ли я»…

    Берем строку: «РџРѕРїРѕРІ».

    Онлайн декодировщик (декодер1 или декодер2) определяет текст «Попов» и кодировки «CP1251 → UTF-8».

    А с вашими модулями, я что только не творил… По смыслу нужно использовать:

    ДекодироватьСтроку(Объект.СтрокаДляПреобразования,»windows-1251″);
    //благо мы знаем, что это windows-1251

    И ваша функция на выходе дает тот же результат: «РџРѕРїРѕРІ».

    Подскажете, «где собака зарыта»?

    Reply
  7. Bonov

    СПАСИБО!!!!

    Reply
  8. ChunLee

    (5) скачал вашу обработку, чтобы выполнить следующую операцию.

    Строку преобразовать в base64.

    Исходная строка «>ґ‚ћIbЦAвGcЁчl•Џќ~o¶»

    должно получиться «PrSCnkli1kHiR2Oo92yVj51+b7Y=»

    увы не получается.

    написал следующий код

    Результат=СтроковыеФункцииКлиентСерверДоп.Base64ВСтроку(Значение);

    подскажите если сделал что-то не то.

    Reply
  9. vandalsvq

    (9) ChunLee, в base64 или из? попробуй итоговую строку закодируй, сравни результат. И ещё если данные из поля формы, они могут быть ошибочными.

    Reply
  10. АндрейКр

    Добрый день! Спасибо за вашу разработку.

    В кодировке win1251 у вас пропущены символы с кодами 160 (неразрывный пробел) и 173 (символ вообще в конфигураторе не отображается, но тем не менее он там есть, если набрать его через alt+0173).

    Reply
  11. sb111

    Не работает. Конфигурация КА 1.3.

    Текстовый файл в UTF-8 как были загогулины так и остаются…

    (Нужно преобразовать в строку)

    Reply
  12. vandalsvq

    (12) можете сделать тест? Прошу прислать на почту vandalsvq[собака]gmail.com

    Reply
  13. sb111

    (13) тест это как ? Я взял из вашего списка процедуру «UTF_8ВСтроку» она выдает ровно туже строку. Онлайн определение кодировки текста выдает utf-8,

    word тоже.

    Reply
  14. sb111

    В общем кодировка в итоге оказалась «UTF-16LE» ….. )

    Все прочиталось как нужно.

    Так что главное определить верно кодировку.

    Reply
  15. vandalsvq

    (15) т.е. проблемы не обнаружено? Кстати есть есть процедура преобразования можешь поделиться с народом.

    Reply
  16. sb111

    (16)ну да. 1с сама все прочла как нужно, если кодировку укажешь верную. Так что процедура не понадобилась.

    Кодировку определили с помощью «Akelpad».

    Reply
  17. endym
    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *