Ich hab mir angeschaut was
HTML::Entities so alles macht. Verwirrt hat mich das Verhalten bei Surrogate Pairs. Surrogate Pairs findet man eigentlich nur bei UTF-16, wenn exotische Zeichen mit 2x2 Bytes kodiert werden. Anscheinen gab es aber vor Urzeiten Programme die aus einem solchen Zeichen zwei numerische HTML Entities gezaubert haben. Deshalb werden diese Fabrikationen in HTML::Entities unterstützt, obwohl das in keinem Standard spezifiziert ist.
Hier ein Beispiel:
[code]
$ cat surrogate_pair.pl
use v5.24;
use strict;
use warnings;
use utf8;
use open ':std', ':encoding(UTF-8)';
use String::Dump qw(dump_hex);
use HTML::Entities qw(decode_entities);
my $smile_surrogate = decode_entities('��');
say "$smile_surrogate via surrogate pair";
say dump_hex($smile_surrogate);
my $smile_codepoint = decode_entities('😁');
say "$smile_codepoint via regular codepoint";
say dump_hex($smile_codepoint);
$ perl surrogate_pair.pl