Thread Surrogate Pairs in UTF-8 auflösen
(28 answers)
Opened by barney at 2025-08-14 14:22 Code (perl): (dl
)
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; Ausgabe im Browser: Früher haben wir richtig gegrinst. Für wenige €€€ schreiben wir uns heute Mails mit einer Fratze 😀 oder mit mehreren 😀😀😀 Last edited: 2025-08-17 11:32:12 +0200 (CEST) |