Регистрация | Войти
Lisp — программируемый язык программирования
RSS
Кириллица в URI
Menschenkindlein - 06.04.2014 19:41, Сообщений - 13
Здравствуйте,

Я так видел, что такие проблемы были, и даже как-то пытались решаться. Интересно узнать, решились ли? А то у меня не работает :(
[#]
Я использую свой форк puri-unicode, который загружается вместо puri.
archimag - 06.04.2014 20:10
[#] Ответ на комментарий от archimag 06.04.2014 20:10
То есть майнтейнеры puri принципиально не принимают патчи? И в quicklisp puri-unicode пока не планируется?
Menschenkindlein - 06.04.2014 20:19
[#] Ответ на комментарий от archimag 06.04.2014 20:10
Да, с puri-unicode все работает прекрасно. Спасибо.
Menschenkindlein - 06.04.2014 20:42
[#] Ответ на комментарий от Menschenkindlein 06.04.2014 20:19
> То есть майнтейнеры puri принципиально не принимают патчи?

Ну, он бы принял патч, если бы не было там привязки к babel. А так я делать не захотел. Ну а насчёт quicklisp, то это не ко мне. Но там есть проблема, которая сейчас никак нигде не освещается - совпадение в названиях asd систем (и так сделано специально). Условно, в gentoo есть virtual-пакеты, но в quicklisp такого нет.
archimag - 06.04.2014 20:50
[#] Ответ на комментарий от archimag 06.04.2014 20:50
archimag, подскажи, пожалуйста, есть ли возможность в puri-unicode при выполнении

(puri:parse-uri "http://localhost:8080/фыва/")

получить не #<PURI:URI http://localhost:8080/%d1%84%d1%8b%d0%b2%d0%b0/>, а #<PURI:URI http://localhost:8080/фыва/>?
Т.е. не приводить урл к виду с процентами. Причем, не столько результат print-object, сколько, например, (puri:uri-path uri)?

Я пробовал менять параметр escape, пробовал трассировать по коду, что-то никак не могу понять, как это победить.
dmitrys99 - 08.07.2014 08:02
[#] Ответ на комментарий от dmitrys99 08.07.2014 08:02
> Причем, не столько результат print-object, сколько, например, (puri:uri-path uri)?

Строка "http://localhost:8080/фыва/" не может быть получена, ибо это противоречит соответствующему RFC.  Но:

CL-USER> (puri:uri-parsed-path #U"http://localhost:8080/фыва/")
(:ABSOLUTE "фыва" "")

и делай что хочешь. Собственно, весь смысл puri-unicode в том, что puri:uri-parsed-path позволяет получить корректные составляющие path. 
archimag - 08.07.2014 12:32
[#] Ответ на комментарий от archimag 08.07.2014 12:32
Попробую спросить по-другому.

Есть вызов curl, который делает то, что мне надо:

curl -vX PUT http://localhost:5984/sh-db/555%40vk/Файл.jpg?rev=15-b00a4878e4769a1935cb2a382c3ccd6b --data-binary @Файл.jpg -H "Content-Type:image/jpg"

В документе в БД CouchDB создается вложение с именем "Файл.jpg".
(суть здесь не в том, что это CouchDB, а в том, что curl понимает и передает url в utf-8).

Соответствующий вызов из Lisp:

(chillax:put-attachment *users-db* "555@vk" "Файл.jpg" #P"Файл.jpg" :rev "23-9fed9f32def4d73f9818faa0eaec4500")

который, в свою очередь, приводит к вызову http-request.

Возможно, я что-то не понимаю в матчасти и что-то делаю неправильно. Но!
Первый вызов дает мне имя вложения Файл.jpg, второй – %d0%a4%d0%b0%d0%b9%d0%bb.jpg.
Я хочу первый :)
dmitrys99 - 10.07.2014 20:22
[#] Ответ на комментарий от dmitrys99 10.07.2014 20:22
> curl понимает и передает url в utf-8

Разве? Я попробовал сделать так у себя и:

curl -v PUT http://localhost:8080/sh-db/555%40vk/Файл.jpg
* Curl_ipv4_resolve_r failed for PUT
* Couldn't resolve host 'PUT'
* Closing connection #0
curl: (6) Couldn't resolve host 'PUT'
* About to connect() to localhost port 8088 (#0)
*   Trying 127.0.0.1...
* connected
* Connected to localhost (127.0.0.1) port 8088 (#0)
> GET /sh-db/555%40vk/Файл.jpg HTTP/1.1
> User-Agent: curl/7.26.0
> Host: localhost:8088
> Accept: */*
> 
* HTTP 1.0, assume close after body
< HTTP/1.0 400 Bad Request
< Connection: close
< 
Your request could not be interpreted by this HTTP server
Non-ASCII character in request line
* Closing connection #0

(у меня на порту 8080 работает домашний SBCL)

> суть здесь не в том, что это CouchDB

Мне показалось, что именно в этом. Потому что если в браузере (смотрел в Chrome и Firefox) вставить адрес http://localhost:8080/sh-db/555%40vk/Файл.jpg,
то я получаю сообщение:

The requested URL /sh-db/555%40vk/%D0%A4%D0%B0%D0%B9%D0%BB.jpg was not found on this server.

Т.е браузеры так делают всегда, а вот curl так не делает (что видно, когда выполняешь curl -v).
archimag - 10.07.2014 21:06
[#] Ответ на комментарий от archimag 06.04.2014 20:10
А как его использовать? Подскажите, пожалуйста.

В лучшем случае

PACKAGE>(restas:define-route test ("/test/test/:(var).html")
     (:sift-variables (var #'hunchentoot:url-decode))
     var)

Получалось, что английский урл-запрос проходит нормально, а русский ловит ошибку в (:sift-variables ...) и 404 страница при обращении к /test/test/ы.html в виде "страница /test/test/%d1%82.html не найдена".

PACKAGE>(restas:define-route test ("/test/test/:(var).html")
     (defvar *test* var))

При таком обращении кириллицей выпадает ошибка что-то вроде Unknown as render *test* via NIL , а в самой тест
PACKAGE> *test*
"Ñ\202‚"

Без же всякой обработки (:sift-variables ...) на странице вместо русской Т красуется Ñ
irmpow - 13.12.2014 18:22
[#] Ответ на комментарий от irmpow 13.12.2014 18:22
> А как его использовать? Подскажите, пожалуйста.

Настроить ASDF и просто установить локально.

Например, у меня в файле ~/.config/common-lisp/source-registry.conf.d/ записано следующее:
(:tree "/home/andrey/development/common-lisp/")
Это заставляет ASDF в первую очередь рекурсивно искать систему в каталоге ~/development/common-lisp.

Теперь делаем (для моей системы):
cd ~/development/commonlisp
git clone git@github.com:archimag/puri-unicode.git
После чего вместо puri будет грузиться puri-unicode.
archimag - 13.12.2014 18:48
[#] Ответ на комментарий от archimag 13.12.2014 18:48
Да не, я не про это. В local-projects положил и quicklisp подтягивает вместо оригинала.

Как его прописать в define-route использовать, чтобы кириллические переменные принимать из url?
irmpow - 13.12.2014 20:27
[#] Ответ на комментарий от irmpow 13.12.2014 20:27
> Как его прописать в define-route использовать, 
> чтобы кириллические переменные принимать из url?

Для этого ничего специально делать не надо. Если грузиться puri-unicode. а не puri, то всё будет автоматом.
archimag - 13.12.2014 20:35
[#] Ответ на комментарий от archimag 13.12.2014 20:35
Огромнейшее спасибо! перезапустил процесс, теперь все переменные могут в кирилицу.
irmpow - 15.12.2014 00:40
@2009-2013 lisper.ru