我想像从普通文本文件中一样轻松地从 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
深入研究源代码,看起来
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
功能,其工作方式相同。