2

以下在这种特殊情况下不起作用,抱怨你给它的任何东西都不是一个字符。

(handler-bind ((sb-int:character-coding-error
                 #'(lambda (c)
                      (invoke-restart 'use-value #\?))))
    (sb-ext:octets-to-string *euc-jp* :external-format :euc-jp))

其中*euc-jp*是包含 EUC-JP 编码文本二进制的变量。

我也试过#\KATAKANA_LETTER_NI了,而不是 #\? 也只是“”。到目前为止没有任何效果。

任何帮助将不胜感激!

编辑:要重现,请使用 drakma*EUC-JP*获取http://blogs.yahoo.co.jp/akira_w0325/27287392.html 。

4

2 回答 2

1

SBCL 1.0.18 中有一个如下所示的表达式mb-util.lisp

(if code
    (code-char code)
    (decoding-error array pos (+ pos bytes) ,format
                    ',malformed pos))

I'm not very familiar with SBCL's internals, but this looks like a bug. The consequent returns a character, while the alternative returns a string (no matter what you give to it via USE-VALUE, it's always converted into a string by way of the STRING function; see the definition of DECODING-ERROR in octets.lisp).

于 2009-01-08T16:46:00.503 回答
0

这个对我有用:

CL-USER> (handler-bind ((sb-int:character-coding-error
                         #'(lambda (c)
                             (declare (ignore c))
                             (invoke-restart 'use-value #\?))))
           (sb-ext:octets-to-string (make-array '(16)
                                                :element-type '(unsigned-byte 8)
                                                :initial-contents '#(181 65 217 66 164 67 181 217 164 223 164 222 164 185 161 163))
                                    :external-format :euc-jp))
"?A?B?C休みます。"

可能*euc-jp*不是(向量(无符号字节 8))?

于 2009-01-07T20:58:58.620 回答