2009-01-07 2 views
2

Ce qui suit ne fonctionne pas dans ce cas particulier, se plaignant que ce que vous lui donnez n'est pas un caractère.Lisp: Besoin d'aide pour obtenir un comportement correct de SBCL lors de la conversion de flux d'octets vers EUC-JP avec des octets malformés

(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* est une variable contenant binaire de texte codé EUC-JP. J'ai également essayé #\KATAKANA_LETTER_NI, au lieu de # \? et aussi "". Rien n'a fonctionné jusqu'ici.

Toute aide serait grandement appréciée!

EDIT: Pour reproduire *EUC-JP*, recherchez http://blogs.yahoo.co.jp/akira_w0325/27287392.html en utilisant drakma.

+0

Veuillez publier un extrait reproductible, c'est-à-dire ce qu'il y a dans votre * EUC-JP *? –

+0

Pourriez-vous formater votre code? Les nouvelles lignes et le retrait approprié peuvent être insérés avant "(invoke-restart ..." et au début du corps du gestionnaire-bind – Svante

Répondre

1

Il y a une expression dans SBCL 1.0.18 de mb-util.lisp qui ressemble à ceci:

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

Je ne suis pas très familier avec les internes de sbcl, mais cela ressemble à un bug. Le conséquent renvoie un caractère, tandis que l'alternative renvoie une chaîne (peu importe ce que vous lui donnez via USE-VALUE, elle est toujours convertie en chaîne au moyen de la fonction STRING; voir la définition de DECODING-ERROR dans octets.lisp).

+0

Je l'ai signalé comme un bug (https: // bugs. launchpad.net/sbcl/+bug/314939) et il a été accepté Merci de m'avoir indiqué le bon fichier source, je pourrais bricoler et espérer ne pas casser les choses :-) –

0

Il fonctionne pour moi:

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* quelque chose aurait-autre qu'un (vecteur (octet non signé 8))?

+0

Cela marche aussi pour moi, mais malheureusement pas sur la séquence * euc-jp * - le décodage va bien jusqu'à ce qu'il doit effectivement insérer un "?" après quoi il meurt.Vous pouvez voir que la majorité du site apparaît correctement dans le débogueur = | –

Questions connexes