Hi ticit,
das Problem ist nahezu beliebig komplex und hat mir auch schon genug graue Haare gebracht, :)
Es gibt mehrere Stellen, die Du überprüfen musst bzw. solltest.
1.) In welchem charset ist das Ausgangsfile codiert? ANSI is zu allgemein, es wird wohl eher cp1252 sein (ähnl. ISO-8859-1).
2.) Wird das File beim Einlesen entsprechend geöffnet? Siehe 'perldoc -f open'. Hier kannst Du eine Codierung einstellen, sofern kein Default IO-Layer systemweit eingestellt ist (über Umgebungsvariablen).
3.) Wie baust Du die Verbindung zu MySQL auf? Eine Verbindung zu MySQL hat ebenfalls eine Codierung! Die wird z.B. in der my.cnf (unter Linux) festgelegt. Das muss dann auch noch getrennt für client- und server-Seite geschehen. Bei mir verwende ich z.B.:
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
# dont use def-char-set, mysql bug +52047
#default-character-set=utf8
collation_server=utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server=utf8
Das stellt die Codierung der Verbindung zum My-SQL Server komplett auf UTF-8 um, ebenso die Collation und den Default-Charset einer Tabelle. Nach der Änderung an my.cnf muss natürlich der MySQL Daemon neu gestartet werden.
Nur die Collation alleine zu setzen hat auf Dein Problem keinen Einfluss, das regelt nur die Sortierreihenfolge bei ner Abfrage.
4.) Arbeitest Du mit nem ORM wie DBIx::Class? Wenn ja kannst Du da beim connect auch einen Parameter übergeben, der die Verbindungs-Codierung auf UTF-8 festlegt. Ich nehme an, das es etwas ähnliches bei DBI bzw. DBD::MySQL gibt.
Das sollte es dann aber gewesen sein. Berichte mal, ob es klappt und setze ggfls. den Thread auf 'gelöst'.
Gruß,
Britzel
Last edited: 2012-10-16 14:52:15 +0200 (CEST)