Thread XML::LibXML - "Malformed UTF-8 Character (fatal" vermeiden (11 answers)
Opened by Bob at 2011-05-28 13:48

rosti
 2011-05-30 14:29
#149243 #149243
User since
2011-03-19
3197 Artikel
BenutzerIn
[Homepage]
user image
Nachgereicht:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
# Testet, ob ein Text UTF-8 kodiert ist
sub is_utf8{
        my $text = shift;
        no warnings;
        use bytes; # es sind bytes zu verglichen

        # text in latin umwandeln, iso-8859-1
        my $iso = pack('C*', unpack('U0U*', $text));
        # diesen text wieder in utf-8 kodieren
        my $utf = pack('U0U*', unpack('C*', $iso));
        # wenn beide Bytes-Ketten gleich sind, ist $text utf-8-kodiert
        return ($utf eq $text) ? 1 : 0;
}


Getestet mit perl v5.6.1 auf Win32 XP. Könnte das mal einer von Euch auf Linux & Co testen?

Edit: Obenstehender Code funktioniert nur dann, wenn zwischen ISO und UTF-8 umgewandelt werden kann, was bei iso-8859 der Fall ist. Insofern ist der Code schlecht, weil der nicht alle Fälle abdeckt.

Eine andere und verbesserte Variante ermittelt mit der U-Schablone eine Liste der Codepoints, diese Codepoints werden dann wieder zu Bytes gemacht und geprüft, ob dasselbe rauskommt, dann liegt eine UTF-8- oder eine ASCII-Kodierung vor, nicht jedoch eine ISO-Kodierung.
Last edited: 2011-05-31 16:41:37 +0200 (CEST)

View full thread XML::LibXML - "Malformed UTF-8 Character (fatal" vermeiden