Lisp: Brauchen Sie Hilfe das richtige Verhalten von SBCL bekommen, wenn Oktett Stream EUC-JP mit fehlerhaften Bytes konvertieren

StackOverflow https://stackoverflow.com/questions/420300

  •  05-07-2019
  •  | 
  •  

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.

War es hilfreich?

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?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top