2013-08-20 4 views
5

Я хочу сохранить некоторые данные с помощью 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 

ответ

3

Я библиотека называется AltWebForm, что ан/декодирует процентов закодированный веб-формы данных:

do http://reb4.me/r3/altwebform 
load-webform "field=%E4%BA%BA" 

Библиотека описана здесь: Rebol and Web Forms.

2

кажется, связано с билетной # 1986, где она обсуждается, является ли эта «ошибка» или изменение из-под своей собственной спецификации Интернет:

Have DEHEX convert UTF-8 sequences from browsers as Unicode.

Если у вас есть определенный опыт в отношении того, что стало стандартным на китайском языке, и вы хотите взвесить, это было бы ценно.

Подобно тому, как в сторону, конкретный случай выше, может быть обработано в PARSE попеременно:

key-value: {field=%E4%BA%BA} 

utf8-bytes: copy #{} 

either parse key-value [ 
    copy field-name to {=} 
    skip 
    some [ 
     and {%} 
     copy enhexed-byte 3 skip (
      append utf8-bytes dehex enhexed-byte 
     ) 
    ] 
] [ 
    print [field-name {is} to string! utf8-bytes] 
] [ 
    print {Malformed input.} 
] 

Это будет выход:

field is 人 

С некоторыми комментариями включены:

key-value: {field=%E4%BA%BA} 

;-- Generate empty binary value by copying an empty binary literal  
utf8-bytes: copy #{} 

either parse key-value [ 

    ;-- grab field-name as the chars right up to the equals sign 
    copy field-name to {=} 

    ;-- skip the equal sign as we went up to it, without moving "past" it 
    skip 

    ;-- apply the enclosed rule SOME (non-zero) number of times 
    some [ 
     ;-- match a percent sign as the immediate next symbol, without 
     ;-- advancing the parse position 
     and {%} 

     ;-- grab the next three chars, starting with %, into enhexed-byte 
     copy enhexed-byte 3 skip (

      ;-- If we get to this point in the match rule, this parenthesized 
      ;-- expression lets us evaluate non-dialected Rebol code to 
      ;-- append the dehexed byte to our utf8 binary 
      append utf8-bytes dehex enhexed-byte 
     ) 
    ] 
] [ 
    print [field-name {is} to string! utf8-bytes] 
] [ 
    print {Malformed input.} 
] 

(Обратите внимание также, что «простой синтаксический разбор» получает топор в пользу enhancements to SPLIT. Таким образом, код записи, например, parse data "=", теперь можно выразить как split data "=" или другие интересные варианты, если вы их проверите ... образцы указаны в билете.)

+0

Этот метод уточняется. Использование 'load v' для построения двоичного файла не является естественным. Две ссылки в http://curecode.org/ великолепны. Я прочту их более внимательно. В вашем коде небольшая ошибка, или моя версия не поддерживает ее? Код '{%} -1 skip' не может работать в моей консоли (Ошибка скрипта: значение вне диапазона: -1). Я изменяю его на '{%}', и он работает. Наконец, большое спасибо за форматирование и реорганизацию. –

+0

@WayneTsui Нет проблем, извините за ошибку ... Я, должно быть, скопировал это из версии, которую я пробовал, что думал, что работал, но не сделал. Проблема с использованием TO заключается в том, что она будет продвигать позицию синтаксиса до этого правила ... так что неправильный ввод, например 'field = x123 \ abc% E4BA% BA', будет принят. Я посмотрю, как правильно пропустить назад, но 'AND' будет гарантировать, что правило будет запущено только в том случае, если проценты являются ближайшей следующей позицией, не продвигаясь вперед ... – HostileFork