1
2
3
4
5
6
7
8
out = [0xD83D, 0xDE00]; // die beiden 16-Bit Code-Points für das GRINNING FACE
var chars = '';
for(i = 0; i < out.length; i++){
console.log(i, out[i])
chars += String.fromCodePoint( out[i] );
}
console.log(chars);
1 2 3 4 5 6 7 8 9 10 11 12 13 14
use Encode; my $char = pack "U*", 0xD83D, 0xDE00; # diese beiden Codepoints # und die zum Zeichen gehörige Bytesequenz ED A0 BD ED B8 80 printf "%X %X %X %X %X %X\n", unpack "C*", encode_utf8($char); # und jetzt umgekehrt, wir haben eine Bytesequenz und wollen die # WTF Codepoints my $bin = pack "C*", 0xED, 0xA0, 0xBD, 0xED, 0xB8, 0x80; my $zeichen = decode_utf8($bin); # intern kodiert my @codepoints = unpack "U*", $zeichen; foreach my $cp( @codepoints ){ printf "%X ", $cp; }
QuoteIm text/html Part ist dass
😀 - U+1F600 - F0 9F 98 80 - GRINNING FACE
korrekt als UTF-8 kodiert.
2025-08-15T11:45:36 barneyDas Content-Transfer-Encoding ist quoted-printable und der Transfer Content wurde korrekt dekodiert. Das ist nicht das Problem.
Quote--=__PartF3FA0D46.1__=
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
QuoteAudimax. =ED=A0=BD=ED=B8=80Wir ha
Quoteggf. m=C3=B6glich ist
1 2
my $char = decode('UTF-8', $octets, Encode::FB_CROAK); # utf8 "\xD83D" does not map to Unicode at C:/Perl64/lib/Encode.pm line 200.
QuoteBei WTF-8 würde das grinning face ja als die vier UTF-16 Bytes kodiert werden.
1
2
3
4
5
6
7
8
out = [0xD83D, 0xDE00];
var chars = '';
for(i = 0; i < out.length; i++){
chars += String.fromCodePoint( out[i] );
let b = new Blob([chars]);
console.log(i, out[i], chars.length, b.size)
}
console.log(chars);
1 2 3
# ED A0 BD ED B8 80 my $bin = pack "C*", 0xED, 0xA0, 0xBD, 0xED, 0xB8, 0x80; my @cps = unpack "U*", decode_utf8 $bin; # D83D DE00
1 2 3
my $H = 0xD83D - 0xD800; # High Surrogate my $L = 0xDE00 - 0xDC00; # Low Surrogate printf "%X", $H * 0x400 + $L + 0x10000; # 1F600
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
use Encode; # Bytes Rohdaten my $fratze = pack "C*", 0xED, 0xA0, 0xBD, 0xED, 0xB8, 0x80; my $text = "Früher haben wir richtig gegrinst. Für wenige €€€ schreiben wir uns heute Mails mit einer Fratze $fratze oder mit mehreren $fratze$fratze$fratze"; # Erzeuge die Liste der Codepoints my @cps = unpack "U*", decode_utf8 $text; my @comp = (); # korrigierte Liste for( my $i = 0; $i < @cps; $i++){ if( $cps[$i] >= 0xD800 && $cps[$i] <= 0xDBFF ){ # Range High Surrogate my $H = $cps[$i] - 0xD800; my $L = $cps[1 + $i] - 0xDC00; my $unicp = $H * 0x400 + $L + 0x10000; push @comp, $unicp; ++$i; } else{ push @comp, $cps[$i]; } } # erzeuge die neue Bin aus der Liste mit den korrigierten Code-Points my $bin = encode_utf8 pack("U*", @comp); # Text UTF-8 kodiert # prüfe die Liste der korrigierten Codepoints $, = "\n"; print map{ sprintf "%X", $_} @comp;