gpt4 book ai didi

sockets - usockets : How do I specify the external format when I open a socket

转载 作者:行者123 更新时间:2023-12-03 11:53:14 24 4
gpt4 key购买 nike

我正在尝试连接到泥客户端,所以我使用 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 之外,没有一种可移植的方式来更改外部格式。

也就是说,您可以绑定(bind) sb-impl::*default-external-format*: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

编辑:也看看 FLEXI-STREAMS .我还没有测试过,但你可以将流转换为 FLEXI-STREAM并指定外部格式。

关于sockets - usockets : How do I specify the external format when I open a socket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20435942/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com