Записать и прочитать UTF-8 в потоке памяти

Учебные задачи

Обмен текстом без файла: запись в ПотокВПамяти, позиционирование в начало и чтение через ЧтениеТекста.

Где и как запускать

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. Внешние файлы и настройки конфигурации не нужны.

  2. Используйте конструктор по потоку; его пятый параметр — ЗаписатьBOM, а не Дописывать из файлового конструктора.


Поток = Новый ПотокВПамяти;
Запись = Неопределено;
Чтение = Неопределено;
Попытка
    Запись = Новый ЗаписьТекста(Поток, КодировкаТекста.UTF8, Символы.ПС, Символы.ВК + Символы.ПС, Ложь);
    Запись.Записать("Книга");
    Запись.Закрыть();
    Запись = Неопределено;
    Поток.Перейти(0, ПозицияВПотоке.Начало);
    Чтение = Новый ЧтениеТекста(Поток, КодировкаТекста.UTF8);
    Текст = Чтение.Прочитать();
    Чтение.Закрыть();
    Чтение = Неопределено;
    Сообщить(Текст);
    Если Текст <> "Книга" Тогда
        ВызватьИсключение "Текст не совпал";
    КонецЕсли;
    Данные = Поток.ЗакрытьИПолучитьДвоичныеДанные();
    Поток = Неопределено;
    Сообщить(Данные.Размер());
Исключение
    Если Запись <> Неопределено Тогда
        Запись.Закрыть();
    КонецЕсли;
    Если Чтение <> Неопределено Тогда
        Чтение.Закрыть();
    КонецЕсли;
    Если Поток <> Неопределено Тогда
        Поток.Закрыть();
    КонецЕсли;
    ВызватьИсключение;
КонецПопытки;

Разбор по шагам

  1. Создаём поток памяти и записываем UTF-8 без BOM и без перевода строки.

  2. Закрываем текстовую запись; поток остаётся отдельным объектом. Перемещаем его позицию на ноль.

  3. ЧтениеТекста получает тот же поток и возвращает текст целиком.

  4. ЗакрытьИПолучитьДвоичныеДанные завершает владение потоком и позволяет проверить количество байтов.

Как проверить результат

  1. Вывод: Книга и размер 10 байтов.

  2. Замените Ложь на Истина в конструкторе записи: UTF-8 BOM добавит три байта, ожидаемый размер станет 13.

  3. Уберите Перейти: чтение начнётся в конце потока и исходный текст не получится.

Ожидаемый результат

Пять букв успешно прочитаны обратно; UTF-8 без BOM занимает десять байтов.

На что обратить внимание

  1. Закрытие текстового чтения по потоку не закрывает сам поток: его жизненным циклом управляйте отдельно.

  2. После ЗакрытьИПолучитьДвоичныеДанные нельзя повторно обращаться к закрытому потоку.

  3. Не путайте перегрузки конструктора: пятый аргумент файлового и потокового вариантов имеет разный смысл.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.