2013-07-15 25 views
5

Emacs içinde slime isteminden yürütüldüğünde, hata olmadan çalışan bir kod var.sbcl kodlama hatası sadece komut isteminden çalıştırıldığında mı?

* (ei:proc-file "BRAvESP000.log" "lixo") 

debugger invoked on a SB-INT:STREAM-ENCODING-ERROR: 
    :UTF-8 stream encoding error on 
    #<SB-SYS:FD-STREAM for "file /Users/arademaker/work/IBM/scolapp/lixo" 
    {10049E8FF3}>: 

    the character with code 55357 cannot be encoded. 

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL. 

restarts (invokable by number or by possibly-abbreviated name): 
    0: [OUTPUT-NOTHING ] Skip output of this character. 
    1: [OUTPUT-REPLACEMENT] Output replacement string. 
    2: [ABORT    ] Exit debugger, returning to top level. 

(SB-IMPL::STREAM-ENCODING-ERROR-AND-HANDLE #<SB-SYS:FD-STREAM for "file /Users/arademaker/work/IBM/scolapp/lixo" {10049E8FF3}> 55357) 
0] 

gizem her iki durumda da aynı SBCL 1.1.8 ve aynı makineyi, Mac OS 10.8.4 kullanıyorum düşünüyoruz: istemi dan SBCL başladı, ben hata var. Herhangi bir fikir?

kodu:

(defun proc-file (filein fileout &key (fn-convert #'identity)) 
    (with-open-file (fout fileout 
        :direction :output 
        :if-exists :supersede 
        :external-format :utf8) 
    (with-open-file (fin filein :external-format :utf8) 
     (loop for line = (read-line fin nil) 
     while line 
     do 
     (handler-case 
     (let* ((line (ppcre:regex-replace "^.*{jsonTweet=" line "{\"jsonTweet\":")) 
       (data (gethash "jsonTweet" (yason:parse line)))) 
      (yason:encode (funcall fn-convert (yason:parse data)) fout) 
      (format fout "~%")) 
      (end-of-file() 
     (format *standard-output* "Error[~a]: ~a~%" filein line))))))) 
+1

Bunu varsayarak başlamanızı öneririz yason sorun değildir:

(write-sequence (babel:octets-to-string (babel:string-to-octets (with-output-to-string (outs) (yason:encode (funcall fn-convert (yason:parse data)) outs)) :encoding :utf-16le) :encoding :utf-16le) fout) 

ben Yason'daki bu düzeltmek için kabul edilmiş bir yama gönderilen hızlı ise - ve kodunuza aşağıdakileri ekleyin: '(format * standart-çıktı *" ~ & ~ {~ x ~^~} "('liste' kod satırı satırı)). Başarısız durumdaki son satır, SLIME ortamındaki karşılık gelen çizgi ile aynı mı? –

+1

Belki birden fazla dizinde BRAvESP000.log adlı dosyalar var ve SLIME içindeysanız veya SBCL'yi manuel olarak başlatıyorsanız geçerli dizin farklıdır. Mutlak yolları dene. – acelent

+0

Karakter kodu bir hata değilse, bu, Unicode aralıklı vekil çiftleri grubuna aittir. Bunlar UTF-8 kodlaması karakterleri değildir, UTF-16 ile kullanım için ayrılmıştır. İşte benim tahminim: web tasarımında özel düzlem karakterlerini özel bir yazı tipiyle birlikte kullanmak üzere (çeşitli oklar, mermiler vb.) Ikon olarak kullanılmak üzere modern bir gelenek var. Twitter özellikle bunu yapıyor (örneğin Github da öyle). Bu, bir HTML sayfasının görüntüleri yüklemekten tasarruf etmesinin bir yoludur (bunlar, özel bir yazı tipinden vektör anahatlarıdır). Emacs'in göndermeden önce onlarla ilgileneceğini hayal ediyorum. –

cevap

1

Bu neredeyse kesin Yason'daki bir hata olduğunu. JSON, BMP olmayan bir karakter kaçtığında, bir vekil çifti aracılığıyla yapılmasını gerektirir.

(map 'list #'char-code (yason:parse "\"\\ud800\\udc00\"")) 
    => (55296 56320) 

Evrenkodlu noktası 55296 (ondalık):; Burada U (babel dönüşüm daha az strln olduğu gibi babel kullanımı isteğe bağlı olarak "\ ud800 \ udc00" olarak json kaçan edilir) 10000 + ile basit bir örnek bir vekil çifti için başlar ve UTF-16'da bir vekil çifti dışında görünmemelidir. Neyse kolayca tekrar UTF-16 dize ve kodlamak için Babel kullanarak çalışılan:

(babel:octets-to-string (babel:string-to-octets (yason:parse "\"\\ud800\\udc00\"") :encoding :utf-16le) :encoding :utf-16le) 
    => "" 

Bu çizgiyi değiştirerek bu geçici bir çözüm mümkün olmalıdır:

(yason:encode (funcall fn-convert (yason:parse data)) fout) 

için UTF-16'ya ve geri dönüştürebileceğiniz bir ara dize kullanın. biz bulacaksınız -

https://github.com/hanshuebner/yason/commit/4a9bdaae652b7ceea79984e0349a992a5458a0dc

İlgili konular