Lisp: Brauchen Sie Hilfe das richtige Verhalten von SBCL bekommen, wenn Oktett Stream EUC-JP mit fehlerhaften Bytes konvertieren
Frage
Der folgende nicht in diesem speziellen Fall arbeiten, beschweren, dass alles, was Sie geben es ist kein Zeichen.
(handler-bind ((sb-int:character-coding-error
#'(lambda (c)
(invoke-restart 'use-value #\?))))
(sb-ext:octets-to-string *euc-jp* :external-format :euc-jp))
Wo *euc-jp*
ist eine Variable binary von EUC-JP codierten Text enthält.
Ich habe versucht #\KATAKANA_LETTER_NI
auch, statt # \? und auch nur „“. Nichts hat bisher funktioniert.
Jede Hilfe wäre sehr geschätzt werden!
EDIT: Um zu reproduzieren *EUC-JP*
, holen http://blogs.yahoo.co. jp / akira_w0325 / 27287392.html drakma verwendet wird.
Lösung
Es ist ein Ausdruck in SBCL 1.0.18 des mb-util.lisp
der wie folgt aussieht:
(if code
(code-char code)
(decoding-error array pos (+ pos bytes) ,format
',malformed pos))
Ich bin nicht sehr vertraut mit SBCL Interna, aber das sieht aus wie ein Bug. Die konsequente gibt einen Charakter, während die Alternative einen String zurückgibt (egal, was Sie es über USE-VALUE
geben, ist es immer in einen String über die STRING
Funktion umgewandelt, die Definition von DECODING-ERROR
in octets.lisp
sehen).
Andere Tipps
Es funktioniert für mich:
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休みます。"
Könnte etwas anderes als ein (Vektor (unsigned-Byte-8)) *euc-jp*
sein?