Я хочу сохранить некоторые данные с помощью html-формы и Rebol cgi. Моя форма выглядит следующим образом:Есть ли функция для декодирования кодированной строки unfode utf-8, как из формы?
<form action="test.cgi" method="post" >
Input:
<input type="text" name="field"/>
<input type="submit" value="Submit" />
</form>
Но юникод символы, такие как китайские, я получаю кодированную форму данных с знаками процента, например %E4%BA%BA
.
(Это для китайского иероглифа «人» ... его UTF-8 форма в виде двоичного литерала Rebol является #{E4BABA}
)
Есть функция в системе, или существующей библиотеки, которые могут декодировать это напрямую? dehex
в настоящее время не распространяется на этот случай. Я в настоящее время декодирования вручную, удалив знаки процента и построения соответствующих бинарных, например:
data: to-string read system/ports/input
print data
;-- this prints "field=%E4%BA%BA"
k-v: parse data "="
print k-v
;-- this prints ["field" "%E4%BA%BA"]
v: append insert replace/all k-v/2 "%" "" "#{" "}"
print v
;-- This prints "#{E4BABA}" ... a string!, not binary!
;-- LOAD will help construct the corresponding binary
;-- then TO-STRING will decode that binary from UTF-8 to character codepoints
write %test.txt to-string load v
Этот метод уточняется. Использование 'load v' для построения двоичного файла не является естественным. Две ссылки в http://curecode.org/ великолепны. Я прочту их более внимательно. В вашем коде небольшая ошибка, или моя версия не поддерживает ее? Код '{%} -1 skip' не может работать в моей консоли (Ошибка скрипта: значение вне диапазона: -1). Я изменяю его на '{%}', и он работает. Наконец, большое спасибо за форматирование и реорганизацию. –
@WayneTsui Нет проблем, извините за ошибку ... Я, должно быть, скопировал это из версии, которую я пробовал, что думал, что работал, но не сделал. Проблема с использованием TO заключается в том, что она будет продвигать позицию синтаксиса до этого правила ... так что неправильный ввод, например 'field = x123 \ abc% E4BA% BA', будет принят. Я посмотрю, как правильно пропустить назад, но 'AND' будет гарантировать, что правило будет запущено только в том случае, если проценты являются ближайшей следующей позицией, не продвигаясь вперед ... – HostileFork