在 Pharo/Smalltalk 中:如何读取具有特定编码的文件?

Mic*_*ael 5 smalltalk pharo

我目前正在阅读这样的文件:

dir := FileSystem disk workingDirectory.
stream := (dir / 'test.txt' ) readStream.
line := stream nextLine.
Run Code Online (Sandbox Code Playgroud)

这在文件被utf-8编码时有效,但当文件有另一种编码时我无法找到该怎么做。

Mic*_*ael 5

这些类ZnCharacterReadStream提供ZnCharacterWriteStream\n与其他编码字符流一起使用的功能UTF-8(这是默认设置)。首先,需要将文件流转换为binary流。之后,它可以被包裹起来ZnCharacter*Stream。这是写入和读取文件的完整示例:

\n\n
dir := FileSystem disk workingDirectory.\n\n(dir / \'test.txt\') writeStreamDo: [ :out |\n  encoded := ZnCharacterWriteStream on: (out binary) encoding: \'cp1252\'.\n  encoded nextPutAll: \'\xc3\x9cber?\'.\n].\n\ncontent := \'?\'.\n(dir / \'test.txt\') readStreamDo: [ :in |\n  decoded := ZnCharacterReadStream on: (in binary) encoding: \'cp1252\'.\n  content := decoded nextLine.\n].\ncontent. " -> should evaluate to \'\xc3\x9cber?\'"\n
Run Code Online (Sandbox Code Playgroud)\n\n

有关更多详细信息,请参阅《Enterprise Pharo a Web Perspective》一书有一章介绍字符编码。

\n


Fuh*_*tor 5

对于 Pharo 7,有一份文件流指南,其中建议:

('test.txt' asFileReference)
    readStreamEncoded: 'cp-1250' do: [ :stream |
        stream upToEnd ].
Run Code Online (Sandbox Code Playgroud)