19 Stimmen

Wie kann ich Unicode mit Perl's DBI behandeln?

Meine lecker-zu-wp Perl-Skript funktioniert, gibt aber für alle "seltsamen" Zeichen eine noch seltsamere Ausgabe. Also habe ich versucht

$description = decode_utf8( $description ); 

aber das macht keinen Unterschied. Ich möchte z.B., dass "go live" zu "go live" wird und nicht zu "go live". Wie kann ich Unicode in Perl behandeln, damit das funktioniert?

UPDATE: Ich fand das Problem war, um utf von DBI musste ich in Perl gesetzt:

my $sql = qq{SET NAMES 'utf8';};
$dbh->do($sql);

Das war der Teil, den ich einstellen musste, der schwierig war. Danke!

0 Stimmen

Reduzieren Sie Ihren Code auf das kürzestmögliche Skript, das das Problem noch immer aufweist. Nehmen Sie die Datenbank aus der Gleichung heraus, um herauszufinden, ob das Problem etwas mit Perl zu tun hat. Entwickeln Sie etwas, das andere testen und debuggen können.

0voto

Loic Punkte 640

Standardmäßig verarbeitet der Treiber Perl/MySQL binäre Daten (zumindest habe ich dies aus einigen Experimenten mit MySQL 5.1 und 5.5 geschlossen).

Ohne mysql_enable_utf8 zu setzen, kodierte/dekodierte ich die Zeichenketten in/aus UTF-8, bevor ich in die Datenbank schrieb/lese.

Man sollte sich nicht auf die Perl-interne String-Repräsentation als Array von Bytes verlassen; man sollte sich bewusst sein, dass das interne 'utf8' nicht garantiert, dass es Standard UTF-8 ist; umgekehrt ist nicht garantiert, dass die Einzelbyte-Kodierung ISO-8859-1 ist; kodieren/dekodieren Sie wirklich nach/von UTF-8 (und nicht 'utf8').

Es gibt auch einige Einstellungen von MySQL (wie SET NAMES oben, soweit ich mich erinnere, gibt es eine Client-Kodierung, eine Verbindungs-Kodierung und eine Server-Kodierung, deren Wechselwirkungen mir nicht ganz klar sind, wenn sie nicht alle denselben Wert haben), die die Kodierungen betreffen; die Einstellung aller auf UTF-8 und das obige Rezept haben bei mir funktioniert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X