UTF-8 Nutzung bei OTRS

Hallo Liste, ergänzend zum Posting http://lists.otrs.org/pipermail/otrs-de/2005-June/003767.html möchte ich bzgl. UTF8-Nutzung in OTRS hinzufügen: Ich habe genau dieselbe Erfahrung gemacht wie Torsten. Meiner Meinung nach muss die DBI-Verbindung direkt nach dem Verbindungsaufbau explizit auf utf8 eingestellt werden, ansonsten werden die Daten vom DB-Server in falschem Zeichensatz geliefert (bei mir latin1). Das Patching von Torsten um dies zu erreichen habe ich etwas verfeinert: 1) In ~/Kernel/Config.pm neuen Config-Parameter hinzufuegen: $Self->{'DatabaseCharset'} = 'utf8'; # Zeichensatz der DB-Verbindung 2) In ~/Kernel/System/DB.pm einfügen [ca. Zeile 72 => neuen Config-Parameter lesen] $Self->{PW} = $Param{DatabasePw} || $Self->{ConfigObject}->Get('DatabasePw'); ## hinzugefuegt: DB-Zeichensatz-Konfiguration lesen $Self->{Charset} = $Param{'DatabaseCharset'} || $Self->{ConfigObject}->Get('DatabaseCharset') || undef; # decrypt pw (if needed) [ca. Zeile 200 => Config-Parameter nutzen] # db connection if (!($Self->{dbh} = DBI->connect("$Self->{DSN}", $Self->{USER}, $Self->{PW}, $Self->{'DB::Attribute'}))) { $Self->{LogObject}->Log( Caller => 1, Priority => 'Error', Message => $DBI::errstr, ); return; } ## hinzugefuegt: DB-Verbindungs-Zeichensatz setzen if (defined $Self->{'Charset'}) { if (!($Self->{dbh}->do("SET NAMES " . $Self->{'Charset'}))) { $Self->{LogObject}->Log( Caller => 1, Priority => 'Error', Message => $DBI::errstr, ); } } return $Self->{dbh}; } 4) Optional kann man nun noch den neuen Config-Parameter dem WebGUI SysConfig bekanntgeben durch Erweitern der ~/Kernel/Config/Files/Framework.xml mit <ConfigItem Name="DatabaseCharset" Required="1" Valid="1"> <Description Lang="en">Default charset for DB connection. "utf8" is a good choice for envirorments with many possible charsetss. Specify another charset (e.g "iso-8859-1"), if only this specific charset is needed.</Description> <Description Lang="de">Standard-Zeichensatz der DB-Verbindung. Wählen Sie "utf8", wenn verschiedene Zeichensätze für die Anzeige benötigt werden. Wir nur ein Zeichensatz eingesetzt (z.B. "latin"), nutzen Sie bitte diese Einstellung.</Description>1 <Group>Framework</Group> <SubGroup>Core</SubGroup> <Setting> <Option SelectedID="latin1"> <Item Key="latin1">latin1</Item> <Item Key="utf8">utf8</Item> </Setting> </ConfigItem> === Um nun sauber die MySQL-DB (erst ab v4.1) zur Nutzung von UTF8 zu überreden, erzeugt man eine neue DB und gibt ihr als zu nutzenden Zeichensatz utf8 mit: [Innerhalb eines MySQL-Clients] CREATE DATABASE otrs DEFAULT CHARACTER SET utf8; Anschließend kann das Dump der b isherigen otrs-DB von latin1 nach utf8 transformiert werden und wieder eingelesen werden: cat dump.sql | iconv -f latin1 -t utf8 | mysql -u otrs -p otrs Sicherlich gibt es vielleicht auch Konvertierungsmechanismen innerhalb der MySQL-DB, diese sind mir jedoch nicht bekannt. Ich bin kein Perl-Experte, darum bitte ich meine obigen Vorschläge kritisch zu betrachten - bei mir funktioniert's so zumindest. Gruß, Alexander

Hallo Alexander, On Wed, Dec 14, 2005 at 11:36:40AM +0100, Alexander Scholler wrote:
ergänzend zum Posting http://lists.otrs.org/pipermail/otrs-de/2005-June/003767.html möchte ich bzgl. UTF8-Nutzung in OTRS hinzufügen:
Ich habe genau dieselbe Erfahrung gemacht wie Torsten. Meiner Meinung nach muss die DBI-Verbindung direkt nach dem Verbindungsaufbau explizit auf utf8 eingestellt werden, ansonsten werden die Daten vom DB-Server in falschem Zeichensatz geliefert (bei mir latin1).
Das Patching von Torsten um dies zu erreichen habe ich etwas verfeinert:
1) In ~/Kernel/Config.pm neuen Config-Parameter hinzufuegen:
$Self->{'DatabaseCharset'} = 'utf8'; # Zeichensatz der DB-Verbindung
2) In ~/Kernel/System/DB.pm einfügen
[ca. Zeile 72 => neuen Config-Parameter lesen]
$Self->{PW} = $Param{DatabasePw} || $Self->{ConfigObject}->Get('DatabasePw'); ## hinzugefuegt: DB-Zeichensatz-Konfiguration lesen $Self->{Charset} = $Param{'DatabaseCharset'} || $Self->{ConfigObject}->Get('DatabaseCharset') || undef;
# decrypt pw (if needed)
[ca. Zeile 200 => Config-Parameter nutzen]
# db connection if (!($Self->{dbh} = DBI->connect("$Self->{DSN}", $Self->{USER}, $Self->{PW}, $Self->{'DB::Attribute'}))) { $Self->{LogObject}->Log( Caller => 1, Priority => 'Error', Message => $DBI::errstr, ); return; } ## hinzugefuegt: DB-Verbindungs-Zeichensatz setzen if (defined $Self->{'Charset'}) { if (!($Self->{dbh}->do("SET NAMES " . $Self->{'Charset'}))) { $Self->{LogObject}->Log( Caller => 1, Priority => 'Error', Message => $DBI::errstr, ); } } return $Self->{dbh}; }
4) Optional kann man nun noch den neuen Config-Parameter dem WebGUI SysConfig bekanntgeben durch Erweitern der ~/Kernel/Config/Files/Framework.xml mit
<ConfigItem Name="DatabaseCharset" Required="1" Valid="1"> <Description Lang="en">Default charset for DB connection. "utf8" is a good choice for envirorments with many possible charsetss. Specify another charset (e.g "iso-8859-1"), if only this specific charset is needed.</Description> <Description Lang="de">Standard-Zeichensatz der DB-Verbindung. Wählen Sie "utf8", wenn verschiedene Zeichensätze für die Anzeige benötigt werden. Wir nur ein Zeichensatz eingesetzt (z.B. "latin"), nutzen Sie bitte diese Einstellung.</Description>1 <Group>Framework</Group> <SubGroup>Core</SubGroup> <Setting> <Option SelectedID="latin1"> <Item Key="latin1">latin1</Item> <Item Key="utf8">utf8</Item> </Setting> </ConfigItem>
===
Um nun sauber die MySQL-DB (erst ab v4.1) zur Nutzung von UTF8 zu überreden, erzeugt man eine neue DB und gibt ihr als zu nutzenden Zeichensatz utf8 mit:
[Innerhalb eines MySQL-Clients] CREATE DATABASE otrs DEFAULT CHARACTER SET utf8;
Anschließend kann das Dump der b isherigen otrs-DB von latin1 nach utf8 transformiert werden und wieder eingelesen werden:
cat dump.sql | iconv -f latin1 -t utf8 | mysql -u otrs -p otrs
Sicherlich gibt es vielleicht auch Konvertierungsmechanismen innerhalb der MySQL-DB, diese sind mir jedoch nicht bekannt.
Ich bin kein Perl-Experte, darum bitte ich meine obigen Vorschläge kritisch zu betrachten - bei mir funktioniert's so zumindest.
Jepp, mit mysql funzt dieser Ansatz. Leider aber nicht mit anderen DBs, weswegen wir diesen Patch nicht einbauen können :(. Im Moment gibt es noch Probleme mit DBD::mysql und dem Übertragen des richtigen Charsets..., wir hoffen das wird irgendwann geändert :).
Gruß, Alexander
Viele Grüße, Christian -- ((otrs)) :: OTRS GmbH :: Europaring 4 :: D - 94315 Straubing Fon: +49 (0) 9421 1862 760 :: Fax: +49 (0) 9421 1862 769 http://www.otrs.com/ :: Communication with success!
participants (2)
-
Alexander Scholler
-
Christian Schoepplein