Lisp: necesita ayuda para obtener el comportamiento correcto de SBCL al convertir el flujo de octetos a EUC-JP con bytes mal formados
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.
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))?