Also, wenn deine Datenbank utf8 Speicherst. DBD::mysql selber holt die Daten nur via ISO-8859-1 ab. Daher hast du einen String, und Perl selber denkt es wäre iso-8859-1 codiert, du musst Perl sagen das der Inhalt utf8 dekodiert ist. Daher jede variable die Daten aus der Datenbank enthält musst du folgendermaßen einmal bearbeiten.
Damit wird das utf-8 flag für diese Variable gesetzt und Perl kann den Inhalt in die richtigen Unicode Zeichen intern umwandeln.
Wenn du "use utf8" am anfang schreibst, dann sagst du perl das die Datei (Skript) selber in utf8 Codiert ist. Ansonsten geht Perl wieder davon aus das das Skript selber "iso-8859-1" Codiert ist. Dass kann ebenfalls etliche Probleme hervorrufen. Wenn du dein Skript also in utf8 Abspeicherst solltest du auch "use utf8;" nutzen.
Weiterhin wenn du auch utf8 ausgeben willst dann musst du das Perl ebenfalls sagen. Sonst wandelt er jeden String um und gibt ihn iso-8859-1 Codiert aus.
Das kannst du mit binmode machen.
Damit setzt du einen einzelnen Handle direkt auf utf8.
Das was du gemacht hast.
Setzt utf8 für STDIN, STDOUT und STDERR.
Besser wäre aber du machst gleich folgendes:
Damit sind dann alle deine Handles automatisch utf8.
NOchmal kurz überblick.
1) "use utf8" => wenn das Skript selber utf8 Kodiert ist
2) "binmode HANDLE ':utf8'" => Setzt einen einzelnen Handle auf UTF8
3) "use encoding ':utf8'" => Setzt die Default Handles auf utf8
4) "use open ':utf8'" => Alle Handles auf utf8 setzen
5) "utf8::decode($variable)" => Einen Einzelnen String flagen damit Perl weiß das dort utf8 gespeichert ist.