我正在尝试连接到 mud 客户端,因此我使用 usockets 通过 tcp 连接。但是在我写完之后,我得到了解码错误读数。我有理由相信编码应该为 ascii,或者至少使用 :clrf 作为行尾指示符,因为在我读到的行上,行尾之前有一个 ^M
(let* ((sock (socket-connect "angalon.net" 3011))
(stream (slot-value sock 'stream)))
(format stream "guest~%")
(force-output stream)
(dotimes (i 40)
(read-line stream))
stream)
:UTF-8 stream decoding error on
#<SB-SYS:FD-STREAM
for "socket 192.168.1.39:65516, peer: 93.174.104.58:3011"
{1004129903}>:
the octet sequence #(255 251 1 80) cannot be decoded.
[Condition of type SB-INT:STREAM-DECODING-ERROR]
我可以验证流的外部格式确实是:utf-8,但问题是如何指定套接字给我的流的外部格式?
(let* ((sock (socket-connect "angalon.net" 3011))
(stream (slot-value sock 'stream)))
(stream-external-format stream))
;; => :UTF-8
只需查看 Clozure CL 后端的源代码,外部格式就被硬编码为ccl:*default-external-format*
我的系统中是UTF-8。 SBCL 后端没有指定外部格式,但它可能会使用 SBCL 默认值创建套接字,这也是 UTF-8。我认为除了修改 usocket 之外,没有一种可移植的方法来更改外部格式。
也就是说,你可以绑定sb-impl::*default-external-format*
to say :latin-1
打电话之前socket-connect
:
(let* ((sb-impl::*default-external-format* :latin-1)
(sock (socket-connect "angalon.net" 3011))
(stream (slot-value sock 'stream)))
(stream-external-format stream))
;; :LATIN-1
编辑:也看看灵活流 http://weitz.de/flexi-streams/。我还没有测试过,但你可以将流转换为FLEXI-STREAM
并指定外部格式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)