以下在这种特殊情况下不起作用,抱怨无论你给它什么都不是一个角色。
(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
,而不是#\?而且还只是“”。到目前为止,没有任何工作。
非常感谢任何帮助!
编辑:要重现*EUC-JP*
,请使用drakma获取http://blogs.yahoo.co.jp/akira_w0325/27287392.html。
答案 0 :(得分:1)
在SBCL 1.0.18 mb-util.lisp
中有一个表达式如下:
(if code
(code-char code)
(decoding-error array pos (+ pos bytes) ,format
',malformed pos))
我对SBCL的内部结构不是很熟悉,但这看起来像个错误。结果返回一个字符,而替代方法返回一个字符串(无论你通过USE-VALUE
给它什么,它总是通过STRING
函数转换成一个字符串;参见{{的定义1}}在DECODING-ERROR
)。
答案 1 :(得分: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))吗?