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

rosti
 2025-08-15 10:10
#197201 #197201
User since
2011-03-19
3687 Artikel
BenutzerIn
[Homepage]
user image
Ok wir üben das mal:

Code (perl): (dl )
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;
}


Das gibt aus:

Code: (dl )
1
2
ED A0 BD ED B8 80
D83D DE00


Also, Perl kommt damit auch klar. Weil ja im Grunde genommen UTF-8 darunter liegt. Aber daß man zwei Codepoints (damit meine ich nicht die Bytes) braucht um ein einziges Zeichen zu repräsentieren, ist wirklich WTF. Weil die Bytesequenz dann 6 Bytes umfasst anstelle 4 Bytes.

Was das Speichern in Datenbanken betrifft: Ich empfehle da, die Bytesequenzen zu speichern, genauso wie in Dateien. Und natürlich in einem dedizierten Feld die Kodierung festzuhalten. Damit man das wiederherstellen kann. Und diese Empfehlung beruht auf Erfahrung.



mfg
Last edited: 2025-08-15 10:16:31 +0200 (CEST)
http://blog.rolfrost.de/

The art of steam.

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