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

时间:2017-05-03 21:38:13

标签: unicode smalltalk memorystream pharo

如何将unicode / utf-8写入MemoryStore中的文件?

通常我可以做以下

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

streamMultiByteFileStream

但是,当我尝试在内存存储上执行相同操作时,我会出现错误

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

错误:存储到可索引对象中的不正确

因为stream有一个普通的WriteStream

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

还有其他办法吗?

3 个答案:

答案 0 :(得分: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.

答案 1 :(得分:1)

这是一个表达式,可以满足您的需求:

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

答案 2 :(得分:1)

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

应该有用。