Nima uchun CGI.pm ilova/x-www-form-urlencoded shakllar bilan ishlashda UTF-8-ni to'g'ri ishlatmaydi?

Men kecha Debian barqarorligini yangiladim va "yangi" Perl 5.14 bilan men "yangi" CGI moduliga ham ega bo'ldim (v3.52). Oldingi versiya 3.43 edi, menimcha. Yangilash mening eski veb-shakllarimni buzdi va men "application/x-www-form-urlencoded" enktipli shakl maydonlaridan UTF-8 belgilari ikki marta dekodlanishini tushundim. "Ko'p qismli/form-ma'lumotlar" enctype bilan hamma narsa yaxshi ishlaydi.

Savol:

  • Nima uchun "application/x-www-form-urlencoded" bo'lgan shakllardagi UTF-8 to'g'ri ishlanmaydi? Ikkilik ma'lumotlarni qayta ishlash uchun "ko'p qismli/forma-ma'lumotlar" yaxshiroq bo'lsa ham, ular hali ham to'g'ri dekodlanishi kerak.

Bu erda dekodlash muammosini hal qiladigan kichik sinov misoli:

#!/usr/bin/perl

use strict;
use warnings;
use utf8::all;
use CGI qw(:all -utf8);

my $q = new CGI;

sub build_form {
  return q|
  <form method="post" enctype="application/x-www-form-urlencoded">
  <br />
  Y: <input type="text" name="y" />
  </form>|;
}

print $q->header( -type=>"text/html; charset=utf-8", ),
  $q->start_html( -title=>"test", -encoding=>"utf-8" ),
  $q->h1(  $q->param(  'x' ) . " " ),
  $q->start_form(),
  "X: ",
  $q->textfield( -name=>'x' ), 
  $q->end_form(), "\n\n", 
  $q->br(),
  $q->h1( $q->param( 'y' ) . " " ),
  build_form(),
  $q->end_html;

PS. Menimcha, bu yangilanish UTF-8 dekodlashini buzdi. Yangilashdan so'ng avtomatik ravishda yaratilgan shakllar noto'g'ri enctype ("application/x-www-form-urlencoded") bilan ko'rinadi, chunki eskirgan yordamchi usullardan foydalanilgan (masalan, startform o'rniga start_form).


person w.k    schedule 09.09.2013    source manba
comment
To'g'ri ishlov berilmaganligini aniqlang? Sizning skriptingiz men uchun yaxshi ishlaydi.   -  person ikegami    schedule 09.09.2013
comment
@ikegami: agar ikkala shakl maydoniga 'õ' kiritsam, Xni yuborish menga ‘õ’ni qaytaradi, Y esa ‘õ’ni beradi. Oxirgisi ikki marta dekodlash natijasidir, AFAIU.   -  person w.k    schedule 09.09.2013


Javoblar (1)


use utf8::all;

qiladi

binmode(STDIN, ':encoding(UTF-8)');

brauzer tomonidan yuborilgan ma'lumotlarni buzadi. Kuzatib boring

binmode(STDIN);

o'zgarishlarni bekor qilish va zararni oldini olish.

person ikegami    schedule 09.09.2013
comment
Sizda tushuntirish bormi, nima uchun bir shakl enktipi ta'sir qiladi, ikkinchisi esa ta'sir qilmaydi? - person w.k; 09.09.2013
comment
Chunki biri uchun dekodlash sodir bo'lganda õ uning UTF-8 kodlashi, ikkinchisi uchun esa URI kodlashi sifatida paydo bo'ladi. - person ikegami; 09.09.2013