首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Punycode...使用Perl

Punycode...使用Perl
EN

Stack Overflow用户
提问于 2018-12-19 19:11:56
回答 2查看 148关注 0票数 0

使用bash:

$ echo '\u043f\u0441\u0438\u0445\u043e\u0442\u0435\u0440\u0430\u043f\u0438\u044f.net‘| ascii2uni -a U -q

психотерапия.net

如何使用perl实现这一点?

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

发布于 2018-12-19 20:08:52

Perl语言中的\u并不意味着"Unicode转义“。Perl使用语法\N{U+43f}。更改您的程序以符合Perl语法,这对我来说是有效的:

代码语言:javascript
复制
#!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";

这将为我输出以下内容,我认为这是预期的结果:

代码语言:javascript
复制
FQDN: [психотерапия.net]

---

---
[.net-43d3auc5ciekjq7byl]

如果从字面上看,fqdn是一个类似于\uabcd\u1234...的字符串,那么可以使用以下命令将其转换为Unicode:

代码语言:javascript
复制
$fqdn =~ s/\\u([[:xdigit:]]{4})/chr(hex($1))/ge;

有关更多详细信息,请参阅另一个答案。

另请参阅

字符串的Quote and Quote-like operators in Perl进行转义

票数 2
EN

Stack Overflow用户

发布于 2018-12-19 20:25:03

\uXXXX与Punycode/IDN一点关系都没有。它看起来像表示Unicode字符的JSON字符串格式,您需要为它们使用正确的工具。

首先,您必须在双引号内转义反斜杠,或者使用单引号。

如果不需要处理代理项对,可以简单地将数字转换为unicode字符。

代码语言:javascript
复制
#!/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模块的情况下进行转换。

代码语言:javascript
复制
#!/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";

附言:请谁纠正我糟糕的英语,谢谢!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53850040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档