将 unicode/utf-8 数据写入内存文件

Writing unicode/utf-8 data to a memory file

如何将 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 << '彼得' ].

Error: Improper store into indexable object

因为stream有一个普通的WriteStream.

我试图通过直接实例化 MultiByteFileStream 来解决它,但这似乎需要真实文件。

还有其他方法吗?

这里有一个表达式可以满足您的需求:

string := '彼得'.
file writeStreamDo: [:stream |
  #utf8 asZnCharacterEncoder
    next: string size
    putAll: string
    startingAt: 1
    toStream: stream]

看起来内存文件系统默认不处理多字节文件。尝试:

| 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.
(FileSystem memory root / 'foo.txt')
  writeStreamDo: [ :out |
    out binary.
    (ZnCharacterWriteStream on: out encoding: #utf8) << '彼得' ].

应该可以。