Thread HTML::Parser und substr() (46 answers)
Opened by GwenDragon at 2023-05-09 13:09

rosti
 2023-05-11 16:03
#194850 #194850
User since
2011-03-19
3460 Artikel
BenutzerIn
[Homepage]
user image
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
use strict;
use warnings;

# auf diese Art und Weise entstehen
# alle Zeichen mit UTF-8-Kodierung
# es gilt die Charactersemantic
my $ae_1 = chr 0xe4;
my $ae_2 = "\N{U+e4}";
my $ae_3 = "\N{LATIN SMALL LETTER A WITH DIAERESIS}";
my $euro = "\N{EURO SIGN}";

print $euro; # Wide character in print, Fehler!
use bytes;   # schalte um auf bytesemantic
print $euro; # Ausgabe OK


Für Zeichen die per pack "U", $codepoint; erzeugt werden gilt ebenfalls die Bytesemantic, diese Zeichen betrachtet Perl intern als utf-8-kodierte Zeichen. Sofern nicht mit use bytes; auf Bytesemantic umgeschaltet wurde.

In Dateien gibt es keine Kodierung. Dateien speichern nur Bytes. Das gilt auch für die Scriptdatei selbst, lenght "ä" liefert per Default also 2. Es sei denn pragma use utf8; wurde gesetzt, dann gilt wieder die charsemantic und length liefert 1. Dieses Verhalten zeigt Perl ab v5.6.1 also seit etwa 2004. Wobei die Unicodeunterstützung in diesen Perlversionen mangelhaft war. Encode kam erst mit v5.8.8 in den Core.

Und noch etwas: Unicode ist keine Kodierung sondern die Verwaltung. Es gibt also keine Unicode-Zeichen. UTf-8 ist ein Serialize-Algorithmus welcher den Zusammenhang zwischen Codepoint und Bytesequenz beschreibt. Dieser Algorithmus steckt in der U-Schablone für die pack()-Funktion und ist natürlich auch in Encode implementiert. Mittlerweile ist dieser Algorithmus auch in JavaScript angekommen, so daß man entweder bytesemantisch oder charsemantisch vorgehen kann (TextDecoder and TextEncoder).

MFG und weiterhin viel Spaß mit Perl ;)

View full thread HTML::Parser und substr()