유니 코드 문제로 어려움을 겪었을 때 쿼리 문자열 구문 분석 테스트 예제를 작성하려고합니다. 즉, 문자 "Omega"(Ω)는 올바르게 디코딩되지 않는 것 같습니다.Perl에서 쿼리 문자열 유니 코드 처리하기
- 유니 코드 : U 2126을 이
- 3 바이트 시퀀스 + : \ XE2 \ X84 \ xa6
- URI 인코딩 : % E2의 % 84 % A6
그래서 내가 쓴이 테스트 프로그램 확인 URI :: Encode를 사용하여 유니 코드 쿼리 문자열을 "디코딩"할 수있었습니다.
use strict;
use warnings;
use utf8::all; # use before Test::Builder clones STDOUT, etc.
use URI::Encode 'uri_decode';
use Test::More;
sub parse_query_string {
my $query_string = shift;
my @pairs = split /[&;]/ => $query_string;
my %values_for;
foreach my $pair (@pairs) {
my ($key, $value) = split(/=/, $pair);
$_ = uri_decode($_) for $key, $value;
$values_for{$key} ||= [];
push @{ $values_for{$key} } => $value;
}
return \%values_for;
}
my $omega = "\N{U+2126}";
my $query = parse_query_string('alpha=%E2%84%A6');
is_deeply $query, { alpha => [$omega] }, 'Unicode should decode correctly';
diag $omega;
diag $query->{alpha}[0];
done_testing;
그리고 테스트의 출력은 : URI :: 인코딩 여기에 깨진하지만, 탈출 :: URI로 전환하고 uri_unescape 기능을 사용하여 동일한보고 할 수있다처럼
query.t ..
not ok 1 - Unicode should decode correctly
# Failed test 'Unicode should decode correctly'
# at query.t line 23.
# Structures begin differing at:
# $got->{alpha}[0] = 'â¦'
# $expected->{alpha}[0] = 'Ω'
# Ω
# â¦
1..1
# Looks like you failed 1 test of 1.
Dubious, test returned 1 (wstat 256, 0x100)
Failed 1/1 subtests
Test Summary Report
-------------------
query.t (Wstat: 256 Tests: 1 Failed: 1)
Failed test: 1
Non-zero exit status: 1
Files=1, Tests=1, 0 wallclock secs (0.03 usr 0.01 sys + 0.05 cusr 0.00 csys = 0.09 CPU)
Result: FAIL
그것은 나에게 보인다 오류. 내가 뭘 놓치고 있니?
'CGI' 모듈은 [pragma import'-utf8' 자동으로 입력을 해독합니다] (http://p3rl.org/CGI#utf8)를 제공합니다. 이것은 의도 한대로 동작합니다 :'perl -e 'use CGI qw (-utf8); my $ cgi = CGI-> new ("alpha = % E2 % 84 % A6"); Devel :: Peek을 사용하십시오. $ cgi-> param ("alpha")''문서에 언급 된주의 사항에주의하십시오. – daxim