bdd2

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

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

См. также

Добавить вознаграждение
Комментарии
1. Владимир Гусев (adhocprog) 1072 08.01.15 02:22 Сейчас в теме
Спасибо.
Сейчас потестируем :)
2. Владимир Гусев (adhocprog) 1072 08.01.15 03:28 Сейчас в теме
Какую кодировку принимает функция СтрокаВBase64 в качестве параметра?
3. Александр Анисков (vandalsvq) 676 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) 676 29.07.15 12:04 Сейчас в теме
(4) freud, декодировать строку из 1251, потом закодировать в 866 не помогает?
6. Владимир Иванов (ogre2007) 42 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) 676 04.09.16 20:48 Сейчас в теме
(9) ChunLee, в base64 или из? попробуй итоговую строку закодируй, сравни результат. И ещё если данные из поля формы, они могут быть ошибочными.
11. Андрей Кравчук (АндрейКр) 124 15.12.16 07:24 Сейчас в теме
Добрый день! Спасибо за вашу разработку.
В кодировке win1251 у вас пропущены символы с кодами 160 (неразрывный пробел) и 173 (символ вообще в конфигураторе не отображается, но тем не менее он там есть, если набрать его через alt+0173).