2009-01-07 17 views
2

以下在这种特殊情况下不起作用,抱怨说不管你给它不是一个字符。Lisp:在将八位字节流转换为格式错误的EUC-JP时,需要帮助从SBCL获得正确的行为

(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

请发布一个可重复的片段,即你的* EUC-JP *中有什么? – 2009-01-07 14:40:45

+0

你能格式化你的代码吗?换行符和适当的缩进可以在“(invoke-restart ...”)和处理程序绑定体开头之前插入 – Svante 2009-01-07 14:42:03

回答

1

有一个表达式SBCL 1.0.18,看起来像这样的mb-util.lisp

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

我不是很熟悉SBCL的内部,但是这看起来像一个bug。随后返回一个字符,而替代方法返回一个字符串(无论您通过USE-VALUE提供给它,它总是通过STRING函数转换为字符串;请参阅octets.lispDECODING-ERROR的定义)。

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))?

+0

对我也适用,但不幸的是不在* euc-jp *序列上 - 解码结果直到它必须实际插入一个“?”,然后死亡。你可以看到,因为大多数网站在调试器中正确弹出= | – 2009-01-07 23:49:27

相关问题