Perl UTF8级联问题

时间:2014-04-01 21:56:19

标签: perl utf-8

在字符串编码然后解码后,我无法将utf8字符串连接到另一个字符串。

#!/usr/bin/perl
use strict;
use utf8;
use URI::Escape;

# binmode(STDOUT, ":utf8");

my $v = "ضثصثضصثشس";
my $v2 = uri_unescape(uri_escape_utf8($v));

print "Works: $v, ", "$v2\n";
print "Fails: $v, $v2\n";
print "Works: " . "$v2\n";

这是输出:

Works: ضثصثضصثشس ,ضثصثضصثشس
Wide character in print at ./testUTF8.pl line 14.
Fails: ضثصثضصثشس, ضثصثضصثشس
Works: ضثصثضصثشس

如果我使用binmode utf8,如perl's docs所示,警告消息消失但所有3都失败:

Fails: ضثصثضصثشس, ضثصثضصثشس
Fails: ضثصثضصثشس, ضثصثضصثشس
Fails: ضثصثضصثشس

发生了什么事?我该如何解决这个问题?

P.S。我需要它转义URL。有没有什么方法可以逃脱/ unescape在perl像javascript一样?例如,Perl给出:%D8%B6%D8%AB%D8%B5%D8%AB%D8%B6%D8%B5%D8%AB%D8%B4%D8%B3

这对于:ØØØ«ØμØ«ØØØμØ«Ø'س

当我使用Javascript转义相同的文本时,我得到:%u0636%u062B%u0635%u062B%u0636%u0635%u062B%u0634%u0633

2 个答案:

答案 0 :(得分:5)

来自URI::Escape的文档:

  

uri_unescape($string,...)
  返回一个字符串,其中每个%XX序列都替换为实际字节(八位字节)。

将结果字节解释为UTF-8并且不会对它们进行解码,您必须手动执行此操作:

use Encode qw/decode_utf8/;

# untested
my $v2 = decode_utf8 uri_unescape uri_escape_utf8 $v;
...

答案 1 :(得分:3)

uri_unescapeuri_escape的倒数。它不假定字节代表UTF-8字符串。

未提供uri_escape_utf8的反转。也许你可以处理错误?

#!/usr/bin/perl
use strict;
use utf8;                     # Source code is UTF-8 encoded.
use open ':std', ':utf8';     # Terminal expects UTF-8.
use URI::Escape;

my $ov = "ضثصثضصثشس";

my $uri_comp = uri_escape_utf8($ov);

my $nv = uri_unescape($uri_comp);
utf8::decode($nv) or die;

print "$ov -> $uri_comp -> $nv\n";

ضثصثضصثشس -> %D8%B6%D8%AB%D8%B5%D8%AB%D8%B6%D8%B5%D8%AB%D8%B4%D8%B3 -> ضثصثضصثشس