Ru-Board.club
← Вернуться в раздел «В помощь системному администратору»

» Перекодировка строк с прецентированными символами

Автор: stupom
Дата сообщения: 09.05.2016 14:20
Скрипт получает данные POST запроса с символами в процентной записи типа %AB%CD.
Пришлось писать перекодировщик, сперва сделал на AWK, но формы несколько килобайт просто вешали сервер, переписал на C, вопрос закрыт.

Но не могу понять, неужели для такой частой операции в *nix нет утилиты? Спрашивал у саппорта хостинга, сказали - нету и порекомендовали использовать perl.
Автор: vlary
Дата сообщения: 09.05.2016 14:56
stupom
Блин, и ты решил пожаловаться? Наш то раздел тут при чем?
Да еще не во флейме, тему создал!
Тебе что, целого раздела по *никсам показалось мало,
что ты и нас своим появлением решил осчастливить?
А по поводу скрипта с данными POST тебе вообще в вебпрограммирование.
Автор: stupom
Дата сообщения: 09.05.2016 15:05
Блин, а куда ещё жалобу писать? Прецентирование используется "везде", где надо в старом формате или протоколе передать данные. Думаю, это инфраструктурный вопрос.
Автор: Mavrikii
Дата сообщения: 11.05.2016 04:28
stupom

Цитата:
это инфраструктурный вопрос.

это вопрос рук. во всех вебиспользуемых языках есть функция URL декодирования.
более того, декодируется все зачастую автоматом (зависит от типа запроса)

Как пример - http://php.net/manual/ru/function.urldecode.php

Цитата:
Внимание. Переменные в суперглобальных массивах $_GET и $_REQUEST уже декодированы. Применение urldecode() к элементам $_GET или $_REQUEST может привести к непредсказуемым и опасным результатам.


поэтому смысл этого поста вообще? ни языка, ни описания проблемы.. нытье одно.


Цитата:
где надо в старом формате или протоколе передать данные.

эм.. в "старом формате" ?)) так данные передаются в http
Автор: stupom
Дата сообщения: 11.05.2016 12:36
Mavrikii, вы путаете анус с пальцем.

Во-первых, вопрос не по веб-серверу. *nix-ы поддерживают множество различных протоколов передачи, в том числе, неверное с десяток, это текст-ориентированные.

А во-вторых, зачем ставить на сервер PHP и разводить пАмойку из несовместимых версий? Сайт начального уровня можно сделать на шелл. При спортивном интересе, даже веб-сервер можно написать.

С другой стороны, есть base64, которая вероятно появилась из sendmail-а, но стала де-факто стандартной утилитой. Меня удивляет, почему нет скажем base16, которая ещё более устойчива для передачи, а при кодировании текстовых потоков, ещё и полностью сохраняет возможность сжатия (в отличие от base64).
Автор: Mavrikii
Дата сообщения: 11.05.2016 14:17
stupom

Цитата:
Во-первых, вопрос не по веб-серверу. *nix-ы поддерживают множество различных протоколов передачи, в том числе, неверное с десяток, это текст-ориентированные.

Я это и так хорошо знаю. Но, к сожалению, не обладаю телепатическими способностями, чтобы понять из первого поста о чем конкретно идет речь.
Как говорится, у вас два выхода - либо смотрите кто разрабатывал RFC по нужному протоколу, высказываете им свое "фи", с предложениями и пожеланиями. Ждете изменений и реализации их. Либо разрабатываете свой протокол и пишите для него свои сервер и клиента, а не кидаете философские вопросы в пустоту.
Автор: stupom
Дата сообщения: 11.05.2016 14:30
Это не философский вопрос. Была практическая задача, для которой, как я думал, должен быть нативный инструмент. Но саппорт сказал, что такого нет. Мне это показалось странным, и я пытаюсь перепроверить, "обратившись к общественности".

-Может оно есть, но называется иначе или легко решается каким-либо способом.
-Может его и нет и тому есть основания, кроме тех, что никому не надо было.

Вполне резонно этим интересоваться.
Автор: Mavrikii
Дата сообщения: 11.05.2016 14:38
stupom

Цитата:
сперва сделал на AWK, но формы несколько килобайт просто вешали сервер,


Ну вот так, подробно, уже и проблема становится очевидной. С самого бы начала так.
А с чего бы пара КБ вешала, может не в этом было дело?
Есть еще несколько способов (сразу под принятым решением) - http://askubuntu.com/questions/53770/how-can-i-encode-and-decode-percent-encoded-strings-on-the-command-line
Автор: stupom
Дата сообщения: 11.05.2016 15:04
AWK вешал, возможно, из-за быдлокодского подхода: из строки надо извлечь символ, функцией printf перевести в число, вычислить и обратно printf-ом вывести как символ. Точно уже не помню, короче printf надо вызывать на каждом символе, плюс функция, которая пересчитывает, вызывается на каждые три символа. Плюс куча конвейеров из sh, и в итоге на килобайт уходила секунда при 400MHz сервера.

Спасибо за ссылку, видел это и кажется даже в переводе. Досконально не разбирался, но в общем там две проблемы, либо сильно нагружают, либо неправильно раскодируют дважды закодированные строки.
Автор: Mavrikii
Дата сообщения: 11.05.2016 20:07
stupom

Цитата:
возможно, из-за быдлокодского подхода: из строки надо извлечь символ, функцией printf перевести в число, вычислить и обратно printf-ом вывести как символ.

смысл? можно же перекодировать когда тело запроса получено целиком, а не гонять awk по каждому символу отдельно.
Автор: stupom
Дата сообщения: 11.05.2016 20:39
Он и не гоняется по символам отдельно, но в AWK-программе функции пересчитывающие символы в код символа и обратно "печатающая" символ по коду, запускается очень часто и вероятно sprintf чрезмерно дорогой.

Код: #!/bin/awk -f

function to10(N) { return index("123456789ABCDEF0",N)%16 }
function getChar(Ch) { return sprintf("%c",to10(substr(Ch,1,1))*16+to10(substr(Ch,2,1))) }

NR == 1 { Form=$0 "F" ; Index=$0 "I" ; SeekIndex=0 ; printf("") > Index }

NR > 1 {
s2=""
for (i=1; i<=length($2); ++i) {
Ch=substr($2,i,1)
if (Ch=="%") { CH=substr($2,++i,2); s2=s2 getChar(CH); ++i }
else if (Ch=="+") s2=s2 " "
else s2=s2 Ch
}
print s2 > Form
print $1, SeekIndex, length(s2) > Index
SeekIndex+=length(s2)+1
}
Автор: Mavrikii
Дата сообщения: 11.05.2016 23:27

Цитата:
но только до sed

это аналогично замене + на пробел
затем % на \\x
и это отправляется на printf "%b"

просто вместо типичных / / в регулярке можно использовать любые символы, тут используется @
Автор: stupom
Дата сообщения: 12.05.2016 09:22
Спасибо, догодался про @, но не могу найти описание этого феномена.

Страницы: 1

Предыдущая тема: Переименование файлов через bat


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.