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.
А в каком формате страница? flexi-streams поддерживают весьма ограниченный набор кодировок (и жутко тормозные при этом). Вызывай drakma:http-request с флагом :force-binary в t и сам декодируй результат.
Ага, ясно. А чем посоветуете декодировать?
> А чем посоветуете декодировать?Если используется SBCL, то можно использовать sb-ext:octets-to-string. Переносимым способом является, например, библиотека
babel. Но, в последнем релизе (0.3) ещё не было поддержки cp1251 - сейчас она есть только в darcs-версии.
Теперь ругается так:
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]
> Теперь ругается так:
Нет, понятно что ругается, ты же пытаешься декодировать как будто это utf-8, но в таком случае и DRAKMA не ругалась бы. Скорей всего страница в другой кодировке (например, cp1251) и её нужно указать.
То есть нужно проверять (как-то) кодировку страницы и указывать ее параметром какой функции?
> То есть нужно проверять (как-то) кодировку страницы и указывать ее параметром какой функции?
Ну конечно, обычно кодировка содержится в заголовках ответа.
Либо, кодировка может быть в заголовках страницы. Вообще что у вас за задача?
Парсить страницы. Предварительно скачивая их в файлы на диск. Зачастую кодировка указанная в тексте страницы не соответствует действительной. Про заголовки ответа можно сказать тоже самое. Предположим, я ее знаю. sb-ext:octets-to-string принимает параметр кодировки?
Я вот так делаю у себя http://paste.lisp.org/display/95659/raw
То есть, по умолчанию подразумеваю, что файл в кодировке utf-8. Если сконвертировать не получилось, то значит latin-1. Вместо latin-1 можно вызвать функцию, которая будет перекодировать в cp1251. Такие пердположения (и допущения) с последовательностью кодировок связаны с логикой работы программы. Код для Lispworks.
На SBCL не работает. Для меня это критично.