【问题标题】:How to encode cyrillic characters for URL and then decode them?如何对 URL 的西里尔字符进行编码然后对其进行解码?
【发布时间】:2012-04-06 19:40:47
【问题描述】:

我在一页上有一个表格:

<form method="POST" accept-charset="UTF-8" action="index.cgi" name="TestForm">

其中一个输入字段“search_string”可用于发送西里尔字符,如果发生这种情况,URL 字符串如下所示:

search_string=%41F%2F%424+%41F%41E%414%416%410%420%41A%410+%418%417+%421%412%418%41D

如何将其解码回我发布到的页面上的原始字符串?

【问题讨论】:

  • 看起来像是经过 url 编码的十六进制数据。原始字符串是什么?

标签: perl utf-8 character-encoding utf8-decode


【解决方案1】:

在你的脚本中尝试一下 (index.cgi):

use Encode;

那么……

$search_string = decode_utf8( $search_string );

另一个想法(如果你想为你的 CGI 输入创建一个 UTF8 友好的哈希):

require Encode;
require CGI;
my $query = CGI ->new;
my $form_input = {};  
foreach my $name ( $query ->param ) {
  my @val = $query ->param( $name );
  foreach ( @val ) {
    $_ = Encode::decode_utf8( $_ );
  }
  $name = Encode::decode_utf8( $name );
  if ( scalar @val == 1 ) {   
    $form_input ->{$name} = $val[0];
  } else {                      
    $form_input ->{$name} = \@val;  # save value as an array ref
  }
}

取自:http://ahinea.com/en/tech/perl-unicode-struggle.html

【讨论】:

  • 好吧,使用 decode_utf8() 得到“AF/B4 AFAEA4A6A0B0AAA0 A8A7 B1A2A8AD”字符串,这不是我输入的原始西里尔字符串。
【解决方案2】:

保留+ 和原始字符串中的任何其他字符的解决方案:

my $s = '%41F%2F%424+%41F%41E%414%416%410%420%41A%410+%418%417+%421%412%418%41D';
$s =~ s/%([[:xdigit:]]+)/chr(hex($1))/eg;
print $s;

结果:

П/Ф+ПОДЖАРКА+ИЗ+СВИН

【讨论】:

    【解决方案3】:

    正确的解决方案,包括空格:

    use open ':std', ':encoding(UTF-8)';
    use Encode;
    
    my $escaped = '%41F%2F%424+%41F%41E%414%416%410%420%41A%410+%418%417+%421%412%418%41D';
    (my $unescaped = $escaped) =~ s/\+/ /g;
    $unescaped =~ s/%([[:xdigit:]]+)/chr hex $1/eg;
    print $unescaped;
    # П/Ф ПОДЖАРКА ИЗ СВИН
    

    感谢Renaud Bompuis 首次识别这些是以% 为前缀的Unicode 代码点。

    我想补充一点,问题中的编码方案非常不寻常,我以前从未见过。通常人们会期望字符串П/Ф ПОДЖАРКА ИЗ СВИН被编码为%D0%9F%2F%D0%A4+%D0%9F%D0%9E%D0%94%D0%96%D0%90%D0%A0%D0%9A%D0%90+%D0%98%D0%97+%D0%A1%D0%92%D0%98%D0%9D,也就是说,首先将字符编码为UTF-8,然后将八位字节进行百分比转义。此方案适用于来自Dr.Kameleon 的答案。

    【讨论】:

      猜你喜欢
      • 2020-06-26
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      • 1970-01-01
      • 2014-12-21
      • 1970-01-01
      • 2015-04-27
      • 1970-01-01
      相关资源
      最近更新 更多