← Архив: Common Lisp

need help

Author: · 26.02.2010 12:33
· original author: jenya
debugger invoked on a FLEXI-STREAMS:EXTERNAL-FORMAT-ENCODING-ERROR in thread #<THREAD "initial thread" RUNNING {AA5E591}>:
  Unexpected value #x90 at start of UTF-8 sequence.
Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.
restarts (invokable by number or by possibly-abbreviated name):
  0: [USE-VALUE] Specify a character to be used instead.
  1: [ABORT    ] Exit debugger, returning to top level.
(FLEXI-STREAMS::SIGNAL-ENCODING-ERROR
 #<FLEXI-STREAMS::FLEXI-UTF-8-FORMAT (:UTF-8 :EOL-STYLE :LF) {BD567E9}>
 "Unexpected value #x~X at start of UTF-8 sequence.")[:EXTERNAL]
Подскажите пожалуйста как побороть такую ошибку. Я так понимаю это происходит при скачивании страницы при помощи drakma.
· original author: archimag
А в каком формате страница? flexi-streams поддерживают весьма ограниченный набор кодировок (и жутко тормозные при этом). Вызывай drakma:http-request с флагом :force-binary в t и сам декодируй результат.
· original author: jenya
Ага, ясно. А чем посоветуете декодировать?
· original author: archimag
> А чем посоветуете декодировать?
Если используется SBCL, то можно использовать sb-ext:octets-to-string. Переносимым способом является, например, библиотека babel. Но, в последнем релизе (0.3) ещё не было поддержки cp1251 - сейчас она есть только в darcs-версии.
· original author: jenya
Спасибо.
· original author: jenya
Теперь ругается так:
debugger invoked on a SB-IMPL::INVALID-UTF8-CONTINUATION-BYTE in thread #<THREAD "initial thread" RUNNING {AA5E591}>:
  Illegal :UTF-8 character starting at byte position 21.                                                            
Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.
restarts (invokable by number or by possibly-abbreviated name):
  0: [USE-VALUE] Supply a replacement string designator.      
  1: [ABORT    ] Exit debugger, returning to top level.       
(SB-IMPL::DECODING-ERROR
 #(60 104 116 109 108 62 10 60 104 101 97 100 ...)
 21                                              
 22                                              
 :UTF-8                                          
 SB-IMPL::INVALID-UTF8-CONTINUATION-BYTE         
 22)                                             
0]
· original author: archimag
> Теперь ругается так:
Нет, понятно что ругается, ты же пытаешься декодировать как будто это utf-8, но в таком случае и DRAKMA не ругалась бы. Скорей всего страница в другой кодировке (например, cp1251) и её нужно указать.
· original author: jenya
То есть нужно проверять (как-то) кодировку страницы и указывать ее параметром какой функции?
· original author: archimag
> То есть нужно проверять (как-то) кодировку страницы и указывать ее параметром какой функции?
Ну конечно, обычно кодировка содержится в заголовках ответа.
· original author: archimag
Либо, кодировка может быть в заголовках страницы. Вообще что у вас за задача?
· original author: jenya
Парсить страницы. Предварительно скачивая их в файлы на диск.  Зачастую кодировка указанная в тексте страницы не соответствует действительной. Про заголовки ответа можно сказать тоже самое. Предположим, я ее знаю. sb-ext:octets-to-string принимает параметр кодировки?
· original author: artem
Я вот так делаю у себя http://paste.lisp.org/display/95659/raw
То есть, по умолчанию подразумеваю, что файл в кодировке utf-8. Если сконвертировать не получилось, то значит latin-1. Вместо latin-1 можно вызвать функцию, которая будет перекодировать в cp1251. Такие пердположения (и допущения) с последовательностью кодировок связаны с логикой работы программы. Код для Lispworks.
· original author: jenya
На SBCL не работает. Для меня это критично.