Perl: конвертировать (высокий) десятичный NCR в 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", $1)))/eg;.)

http://www.endmemo.com/unicode/unicodeconverter.php

Также мне нужно преобразовать его обратно из UTF-8 в десятичные NCR

Я ломаю голову над этим уже полдня, любая помощь очень ценится!

2 ответа

Решение
#!/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 $1/ge;

my $r = join q(), map { sprintf '%%%2X', ord } split //, encode('utf8', $utf);
is($r, $out);

(my $s = $r) =~ s/%(..)/chr hex $1/ge;
$s = decode('utf8', $s);
$s = join q(), map '&#' . ord . ';', split //, $s;
is($s, $in);

То, что вы называете "UTF-8", на самом деле является кодировкой URL.


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);
Другие вопросы по тегам