使用bash:
$ echo '\u043f\u0441\u0438\u0445\u043e\u0442\u0435\u0440\u0430\u043f\u0438\u044f.net‘| ascii2uni -a U -q
психотерапия.net
如何使用perl实现这一点?
use utf8;
use URI::_punycode (decode_punycode,encode_punycode);
$fqdn = "\u043f\u0441\u0438\u0445\u043e\u0442\u0435\u0440\u0430\u043f\u0438\u044f.net";
$fqdn = `echo $fqdn | ascii2uni -a U -q`;
$unicode = encode_punycode($fqdn);
print "$unicode\n";返回:
$ perl test.pl
043f044104380445043e0442043504400430043f0438044f.net
发布于 2018-12-19 20:08:52
Perl语言中的\u并不意味着"Unicode转义“。Perl使用语法\N{U+43f}。更改您的程序以符合Perl语法,这对我来说是有效的:
#!perl
use strict;
use warnings;
use utf8;
use URI::_punycode qw(decode_punycode encode_punycode);
binmode STDOUT, ':encoding(UTF-8)';
my $fqdn = "\N{U+043f}\N{U+0441}\N{U+0438}\N{U+0445}\N{U+043e}\N{U+0442}\N{U+0435}\N{U+0440}\N{U+0430}\N{U+043f}\N{U+0438}\N{U+044f}.net";
print "FQDN: [$fqdn]\n";
print "\n---\n";
my $punicode = encode_punycode($fqdn);
print "\n---\n";
print "[$punicode]\n";这将为我输出以下内容,我认为这是预期的结果:
FQDN: [психотерапия.net]
---
---
[.net-43d3auc5ciekjq7byl]如果从字面上看,fqdn是一个类似于\uabcd\u1234...的字符串,那么可以使用以下命令将其转换为Unicode:
$fqdn =~ s/\\u([[:xdigit:]]{4})/chr(hex($1))/ge;有关更多详细信息,请参阅另一个答案。
另请参阅
发布于 2018-12-19 20:25:03
\uXXXX与Punycode/IDN一点关系都没有。它看起来像表示Unicode字符的JSON字符串格式,您需要为它们使用正确的工具。
首先,您必须在双引号内转义反斜杠,或者使用单引号。
如果不需要处理代理项对,可以简单地将数字转换为unicode字符。
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Encode;
my $fqdn = '\u043f\u0441\u0438\u0445\u043e\u0442\u0435\u0440\u0430\u043f\u0438\u044f.net';
$fqdn =~ s/\\u([[:xdigit:]]{4})/chr(hex($1))/ge;
print encode_utf8 $fqdn;
print "\n";如果你必须考虑它们,你仍然可以在没有非核心CPAN模块的情况下进行转换。
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Encode;
my $fqdn = '\u043f\u0441\u0438\u0445\u043e\u0442\u0435\u0440\u0430\u043f\u0438\u044f.net';
my $re_hex = qr/[[:xdigit:]]{4}/;
my $re_uni = qr/\\u$re_hex/;
my $re_uni_capture = qr/\\u($re_hex)/;
$fqdn = join q{}, map {
/^$re_uni/
? decode 'utf-16-be', pack "n*", map { hex } m/$re_uni_capture/g
: $_
} split qr/(${re_uni}*)/, $fqdn;
print encode_utf8 $fqdn;
print "\n";附言:请谁纠正我糟糕的英语,谢谢!
https://stackoverflow.com/questions/53850040
复制相似问题