SBCL中的编码

话说Lisp对Unicode支持很好,但是今天发现个奇怪的问题,通过sbcl的repl存储到redis中的数据,并不是UTF-8的,并且是完全错误的。

通过下面的方式检查了下输入和输出

(stream-external-format *standard-output*)
(stream-external-format *standard-input*)
sb-impl::*default-external-format*

得到的结果竟然是(:ASCII :REPLACEMENT #\?),这个就很麻烦了。直接发现了下面这段代码,很暴力呀,但是只对sbcl有效,不知道ccl中应当怎么处理(找时间查查资料测试下吧)。

(defun set-default-external-format (external-format)
  (assert (sb-impl::find-external-format external-format))
  (setf sb-impl::*default-external-format* external-format)
  (with-output-to-string (*error-output*)
    (setf sb-sys:*stdin*
          (sb-sys:make-fd-stream 0 :name "standard input" :input t :buffering :line))
    (setf sb-sys:*stdout*
          (sb-sys:make-fd-stream 1 :name "standard output" :output t :buffering :line))
    (setf sb-sys:*stderr*
          (sb-sys:make-fd-stream 2 :name "standard error" :output t :buffering :line))
    (setf sb-sys:*tty* 
        (make-two-way-stream sb-sys:*stdin* sb-sys:*stdout*)) 
    (princ (get-output-stream-string *error-output*) sb-sys:*stderr*)))

你可能感兴趣的:(Stream,unicode,lisp,sbcl)