Perl:将(高)十进制 NCR 转换为 UTF-8
Perl: Convert (high) decimal NCR to UTF-8
我有这个字符串(十进制 NCR):日本の鍼灸とは
表示日语文字日本の鍼灸とは
。
但我需要 (UTF-8): %E6%97%A5%E6%9C%AC%E3%81%AE%E9%8D%BC%E7%81%B8%E3%81%A8%E3%81%AF
对于第一个字符:日
⇒日
⇒%E6%97%A5
这个网站可以做到,但我如何在 Perl 中获得它? (如果可能,在单个正则表达式中,如 s/\&\#([0-9]+);/uc('%'.unpack("H2", pack("c", )))/eg;
。)
http://www.endmemo.com/unicode/unicodeconverter.php
我还需要将其从 UTF-8 再次转换回十进制 NCR
我已经为这个问题绞尽脑汁半天了,非常感谢任何帮助!
#!/usr/bin/perl
use strict;
use warnings;
use Test::More tests => 2;
use Encode qw{ encode decode };
my $in = '日本の鍼灸とは'; # 日本の鍼灸とは
my $out = '%E6%97%A5%E6%9C%AC%E3%81%AE%E9%8D%BC%E7%81%B8%E3%81%A8%E3%81%AF';
(my $utf = $in) =~ s/&#(.*?);/chr /ge;
my $r = join q(), map { sprintf '%%%2X', ord } split //, encode('utf8', $utf);
is($r, $out);
(my $s = $r) =~ s/%(..)/chr hex /ge;
$s = decode('utf8', $s);
$s = join q(), map '&#' . ord . ';', split //, $s;
is($s, $in);
你说的"UTF-8"其实就是URL-encoding.
HTML 实体 (日
) ⇒ 文本 (日
) ⇒ URI 组件 (%E6%97%A5
):
use HTML::Entities qw( decode_entities );
use URI::Escape qw( uri_escape_utf8 );
my $text = decode_entities($html);
my $uri_component = uri_escape_utf8($text);
URI 组件(%E6%97%A5
)⇒ 文本(日
)⇒ HTML 实体(日
):
use Encode qw( decode_utf8 );
use HTML::Entities qw( encode_entities );
use URI::Escape qw( uri_unescape );
my $text = decode_utf8(uri_unescape($uri_component));
my $html = encode_entities($text);
我有这个字符串(十进制 NCR):日本の鍼灸とは
表示日语文字日本の鍼灸とは
。
但我需要 (UTF-8): %E6%97%A5%E6%9C%AC%E3%81%AE%E9%8D%BC%E7%81%B8%E3%81%A8%E3%81%AF
对于第一个字符:日
⇒日
⇒%E6%97%A5
这个网站可以做到,但我如何在 Perl 中获得它? (如果可能,在单个正则表达式中,如 s/\&\#([0-9]+);/uc('%'.unpack("H2", pack("c", )))/eg;
。)
http://www.endmemo.com/unicode/unicodeconverter.php
我还需要将其从 UTF-8 再次转换回十进制 NCR
我已经为这个问题绞尽脑汁半天了,非常感谢任何帮助!
#!/usr/bin/perl
use strict;
use warnings;
use Test::More tests => 2;
use Encode qw{ encode decode };
my $in = '日本の鍼灸とは'; # 日本の鍼灸とは
my $out = '%E6%97%A5%E6%9C%AC%E3%81%AE%E9%8D%BC%E7%81%B8%E3%81%A8%E3%81%AF';
(my $utf = $in) =~ s/&#(.*?);/chr /ge;
my $r = join q(), map { sprintf '%%%2X', ord } split //, encode('utf8', $utf);
is($r, $out);
(my $s = $r) =~ s/%(..)/chr hex /ge;
$s = decode('utf8', $s);
$s = join q(), map '&#' . ord . ';', split //, $s;
is($s, $in);
你说的"UTF-8"其实就是URL-encoding.
HTML 实体 (日
) ⇒ 文本 (日
) ⇒ URI 组件 (%E6%97%A5
):
use HTML::Entities qw( decode_entities );
use URI::Escape qw( uri_escape_utf8 );
my $text = decode_entities($html);
my $uri_component = uri_escape_utf8($text);
URI 组件(%E6%97%A5
)⇒ 文本(日
)⇒ HTML 实体(日
):
use Encode qw( decode_utf8 );
use HTML::Entities qw( encode_entities );
use URI::Escape qw( uri_unescape );
my $text = decode_utf8(uri_unescape($uri_component));
my $html = encode_entities($text);