2013-08-20 16 views
5

Ich möchte einige Daten mit einem HTML-Formular und Rebol CGI speichern. Meine Form sieht wie folgt aus:Gibt es eine Funktion zum Dekodieren von codierten Unicode-UTF-8-String wie aus einem Formular?

<form action="test.cgi" method="post" > 

    Input: 

    <input type="text" name="field"/> 
    <input type="submit" value="Submit" /> 

</form> 

Aber für Unicode-Zeichen wie Chinesisch, erhalte ich die codierte Form der Daten mit Prozentzeichen, beispielsweise %E4%BA%BA.

(Dies ist für das chinesische Schriftzeichen „人“ ... seine UTF-8-Form als Rebol binäres Literal #{E4BABA})

Gibt es eine Funktion im System oder einer vorhandenen Bibliothek, die kann das direkt dekodieren? dehex scheint derzeit diesen Fall nicht zu decken. Ich Decodierung dieses derzeit manuell durch die Prozentzeichen zu entfernen und die entsprechenden binären Konstruktion, wie folgt aus:

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 

Antwort

3

Ich habe eine Bibliothek AltWebForm genannt, die en/decodiert Daten Prozent-encoded Webformular:

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

Die Bibliothek ist hier beschrieben: Rebol and Web Forms.

2

Sieht Ticket # 1986 bezogen werden, wo es diskutiert wird, ob dies ein „Bug“ ist oder das Internet unter seinem eigenen spec Wechsel aus:

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

Wenn Sie spezifische Erfahrung haben, was auf Chinesisch Standard geworden ist und wiegen möchten, wäre das wertvoll.

Nebenbei bemerkt, der spezielle Fall oben in PARST behandelt wurde, könnte alternativ als:

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.} 
] 

Das wird ausgegeben:

field is 人 

Mit einigen Kommentaren enthalten:

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.} 
] 

(Beachten Sie auch, dass "einfaches Parsen" die Axt zugunsten vonbekommt. So schreiben Code wie parse data "=" kann jetzt stattdessen als split data "=" ausgedrückt werden, oder andere coole Varianten, wenn Sie sie auschecken ... Proben sind im Ticket.)

+0

Diese Methode ist genauer geklärt. Die Verwendung von 'load v' zum Konstruieren der Binärdatei ist nicht natürlich. Die zwei Links in http://curecode.org/ ist großartig. Ich werde sie sorgfältiger lesen. Es gibt einen kleinen Fehler in deinem Code oder meine Version unterstützt ihn nicht? Der Code '{%} -1 skip' kann in meiner Konsole nicht funktionieren (Skriptfehler: Wert außerhalb des Bereichs: -1). Ich ändere es zu 'to {%}' und es funktioniert. Endlich, vielen Dank für Formatierung und Reorganisation. –

+0

@WayneTsui Kein Problem, sorry wegen des Fehlers ... Ich muss das von einer Version kopiert haben, die ich versuchte, dass ich dachte, arbeitete aber nicht. Ein Problem bei der Verwendung von TO ist, dass es die Parse-Position bis zu dieser Regel weiterbringt ... so würde eine fehlerhafte Eingabe wie "field = x123 \ abc% E4BA% BA" akzeptiert werden. Ich werde schauen, wie man richtig rückwärts springt, aber "AND" wird sicherstellen, dass die Regel nur ausgelöst wird, wenn Prozent die nächste unmittelbare Position ist, ohne weiterzugehen ... – HostileFork