Есть ли функция для декодирования закодированной строки 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 "="
или другие классные варианты, если вы проверите их... образцы в билете.)