Thread Surrogate Pairs in UTF-8 auflösen (28 answers)
Opened by barney at 2025-08-14 14:22

rosti
 2025-08-17 11:22
#197221 #197221
User since
2011-03-19
3687 Artikel
BenutzerIn
[Homepage]
user image
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)
http://blog.rolfrost.de/

The art of steam.

View full thread Surrogate Pairs in UTF-8 auflösen