Как записать Unicode / UTF-8 в файл в MemoryStore?

Обычно я могу сделать следующее

fs := FileSystem workingDirectory.
file := fs / 'file.txt'.
file writeStreamDo: [ :stream | stream << '彼得' ].
file contents. "'彼得'"

stream есть MultiByteFileStream.

Однако, когда я пытаюсь сделать то же самое на памяти, я и с ошибкой

fs := FileSystem memory.
file := fs / 'file.txt'.
file writeStreamDo: [ :stream | stream << '彼得' ].

Ошибка: неправильное хранение в индексируемом объекте

Потому что stream есть обычный WriteStream.

Я пытался обойти это, напрямую создавая экземпляр MultiByteFileStream, однако для этого, похоже, требуется настоящий файл.

Есть ли другой способ?

3
Peter Uhnak 4 Май 2017 в 00:38

3 ответа

Лучший ответ

Похоже, файловая система памяти не обрабатывает многобайтовые файлы по умолчанию. Пытаться:

| fs file stream |

fs := FileSystem memory.
file := fs / 'file.txt'.
stream := MultiByteBinaryOrTextStream on: (fs open: file writable: true).
stream converter: UTF8TextConverter new.
[ stream << '彼得' ] ensure: [ stream close ].
file.
3
Alistair 3 Май 2017 в 22:11

Вот выражение, которое будет делать то, что вы ищете:

string := '彼得'.
file writeStreamDo: [:stream |
  #utf8 asZnCharacterEncoder
    next: string size
    putAll: string
    startingAt: 1
    toStream: stream]
1
Leandro Caniglia 4 Май 2017 в 20:02
(FileSystem memory root / 'foo.txt')
  writeStreamDo: [ :out |
    out binary.
    (ZnCharacterWriteStream on: out encoding: #utf8) << '彼得' ].

Должно сработать.

1
Leandro Caniglia 5 Май 2017 в 20:30