Lisp: necesita ayuda para obtener el comportamiento correcto de SBCL al convertir el flujo de octetos a EUC-JP con bytes mal formados

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

  •  05-07-2019
  •  | 
  •  

Pregunta

Lo siguiente no funciona en este caso particular, quejándose de que cualquier cosa que le des no es un personaje.

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

Donde * euc-jp * es una variable que contiene binario de texto codificado EUC-JP.

También probé # \ KATAKANA_LETTER_NI , en lugar de # \? y también solo " " ;. Nada ha funcionado hasta ahora.

¡Cualquier ayuda sería muy apreciada!

EDITAR: Para reproducir * EUC-JP * , busque http://blogs.yahoo.co.jp/akira_w0325/27287392.html usando drakma.

¿Fue útil?

Solución

Hay una expresión en mb-util.lisp de SBCL 1.0.18 que se ve así:

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

No estoy muy familiarizado con las partes internas de SBCL, pero esto parece un error. El consecuente devuelve un carácter, mientras que la alternativa devuelve una cadena (sin importar lo que le des a través de USE-VALUE , siempre se convierte en una cadena mediante STRING función; consulte la definición de DECODING-ERROR en octets.lisp ).

Otros consejos

Funciona para mí:

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

¿Podría * euc-jp * ser algo más que un (vector (byte sin signo 8))?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top