Perl UTF8级联问题

Dem*_*Imp 5 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";
Run Code Online (Sandbox Code Playgroud)

这是输出:

Works: ????????? ,?????????
Wide character in print at ./testUTF8.pl line 14.
Fails: ?????????, ضثصثضصثشس
Works: ?????????
Run Code Online (Sandbox Code Playgroud)

如果我使用binmode utf8,正如perl的文档所示,警告消息消失但所有3都失败:

Fails: ?????????, ضثصثضصثشس
Fails: ?????????, ضثصثضصثشس
Fails: ضثصثضصثشس
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?我怎样才能解决这个问题?

PS我需要它转义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

amo*_*mon 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;
...
Run Code Online (Sandbox Code Playgroud)