Thread XML::LibXML - "Malformed UTF-8 Character (fatal" vermeiden
(11 answers)
Opened by Bob at 2011-05-28 13:48
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) |