Есть ли функция для декодирования закодированной строки Unicode UTF-8, как из формы?

Я хочу хранить некоторые данные с помощью HTML-формы и Rebol CGI. Моя форма выглядит так:

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

     Input:

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

</form>

Но для символов Unicode, таких как китайский, я получаю закодированную форму данных со знаками процента, например %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

2 ответа

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

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

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

Похоже, что это связано с билетом № 1986, где обсуждается, является ли это "ошибкой" или Интернетом выходит из-под его собственной спецификации:

Пусть DEHEX конвертирует последовательности UTF-8 из браузеров в 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.}
]

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

Другие вопросы по тегам