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

Опубликовал Александр Анисков (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
.txt 19,62Kb
08.10.16
101
.txt 19,62Kb 101 Скачать
СтроковыеФункцииСлужебныйКлиентСерверПовтИсп.txt
.txt 8,99Kb
08.10.16
87
.txt 8,99Kb 87 Скачать

См. также

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

И ваша функция на выходе дает тот же результат: "РџРѕРїРѕРІ".
Подскажете, "где собака зарыта"?
7. Bonov 25.08.16 20:26 Сейчас в теме
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) 684 04.09.16 20:48 Сейчас в теме
(9) ChunLee, в base64 или из? попробуй итоговую строку закодируй, сравни результат. И ещё если данные из поля формы, они могут быть ошибочными.
11. Андрей Кравчук (АндрейКр) 124 15.12.16 07:24 Сейчас в теме
Добрый день! Спасибо за вашу разработку.
В кодировке win1251 у вас пропущены символы с кодами 160 (неразрывный пробел) и 173 (символ вообще в конфигураторе не отображается, но тем не менее он там есть, если набрать его через alt+0173).
12. S Sf (sb111) 9 02.02.17 17:16 Сейчас в теме
Не работает. Конфигурация КА 1.3.
Текстовый файл в UTF-8 как были загогулины так и остаются...
(Нужно преобразовать в строку)
13. Александр Анисков (vandalsvq) 684 02.02.17 21:00 Сейчас в теме
(12) можете сделать тест? Прошу прислать на почту vandalsvq[собака]gmail.com
14. S Sf (sb111) 9 03.02.17 11:18 Сейчас в теме
(13) тест это как ? Я взял из вашего списка процедуру "UTF_8ВСтроку" она выдает ровно туже строку. Онлайн определение кодировки текста выдает utf-8,
word тоже.
15. S Sf (sb111) 9 03.02.17 12:00 Сейчас в теме
В общем кодировка в итоге оказалась "UTF-16LE" ..... )
Все прочиталось как нужно.
Так что главное определить верно кодировку.
16. Александр Анисков (vandalsvq) 684 03.02.17 13:59 Сейчас в теме
(15) т.е. проблемы не обнаружено? Кстати есть есть процедура преобразования можешь поделиться с народом.
17. S Sf (sb111) 9 03.02.17 16:54 Сейчас в теме
(16)ну да. 1с сама все прочла как нужно, если кодировку укажешь верную. Так что процедура не понадобилась.
Кодировку определили с помощью "Akelpad".