使用 with-open-gzip-file 读取 UTF-8

问题描述 投票:0回答:1

我想像从普通文本文件中一样轻松地从 gzip 文件中读取 UTF-8 字符。

不幸的是,with-open-gzip-file 似乎没有按预期工作。

我试过这个:

CL-USER> (require :gzip-stream)
NIL
CL-USER> (with-open-file (in "test-utf8.txt") (read-line in))
"abéè"
NIL
CL-USER> (gzip-stream:with-open-gzip-file (in "test-utf8.txt.gz") (read-line in))
"abéè"
NIL

我期待的是“abéè”而不是“abéè”。

gzip-stream 是否损坏,我应该使用另一个包,或者是否缺少一些配置?

TIA 有任何提示吗,Peter

utf-8 common-lisp gzip
1个回答
0
投票

深入研究源代码,看起来

gzip-stream
read-char
实现读取单个字节并将其转换为字符;因此,对于任何多字节字符编码(如 UTF-8),它都会严重失败。一种解决方法是从解压缩的流中读取字节而不是字符,并通过其他方式将它们解码为字符串。例如,在 CCL 中:

CL-USER> (ql:quickload '(:alexandria :gzip-stream))
CL-USER> (gzip-stream:with-open-gzip-file (in "test-utf8.txt.gz")
           (decode-string-from-octets
             (alexandria:read-stream-content-into-byte-vector in)
             :external-format :utf-8))
"abéè"
6

SBCL 有一个

octets-to-string
功能,其工作方式相同。

© www.soinside.com 2019 - 2024. All rights reserved.