Lisp:在将八位字节流转换为具有格式错误的字节的 EUC-JP 时,需要帮助从 SBCL 获得正确的行为

发布于 2024-07-12 01:59:44 字数 618 浏览 9 评论 0原文

以下内容在这种特殊情况下不起作用,抱怨您给出的任何内容都不是字符。

(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*,请获取 http: //blogs.yahoo.co.jp/akira_w0325/27287392.html 使用德拉克马。

The following does not work in this particular case, complaining that whatever you give it is not a character.

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

Where *euc-jp* is a variable containing binary of EUC-JP encoded text.

I have tried #\KATAKANA_LETTER_NI as well, instead of #\? and also just "". Nothing has worked so far.

Any help would be greatly appreciated!

EDIT: To reproduce *EUC-JP*, fetch http://blogs.yahoo.co.jp/akira_w0325/27287392.html using drakma.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

熟人话多 2024-07-19 01:59:44

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 转换为字符串函数;参见octets.lispDECODING-ERROR的定义)。

There's an expression in SBCL 1.0.18's mb-util.lisp that looks like this:

(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).

花伊自在美 2024-07-19 01:59:44

它对我有用:

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* 可能是 (vector (unsigned-byte 8)) 以外的东西?

It works for me:

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休みます。"

Might *euc-jp* be something other than a (vector (unsigned-byte 8))?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文