Thread für in der MySQL-Datenbank ... (11 answers)
Opened by rtp_de at 2013-11-26 15:48

topeg
 2013-11-27 12:24
#172251 #172251
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Als Beispiel:
Binär ist "ë" als UTF-8 unterschiedlich zu ISO-8859-1 und unterscheidet sich zu ISO-8859-5 und das unterschiedet sich zu UTF-16. Die Kodierungen unterscheiden sich alle. Nicht nur die "Position" des Zeichen in der Tabelle ist unterschiedlich, auch die Anzahl der verwendeten Bytes unterscheiden sind. length gibt verschiedne Werte aus.

Es gibt nun zwei Wege damit umzugehen. Man kann es dem Programmierer überlassen für jede Kodierung spezialisierte Funktionen und Methoden zu benutzen, oder man hilft ihm alles auf eine Codierung umzustellen und dann dafür ein einziges Funktions-set anzubieten. PHP z-B. ist den ersten weg gegangen. Alle Daten sind binär und du musst für jede Kodierung spezialisierte Funktionen benutzen. Perl hat den zweiten Weg gewählt. Erst wandelt du die ein kommende Kodierung in das perl-interne Format und dann kannst du normal damit arbeiten. length gibt dann z.B nicht die Anzahl der Bytes sondern die Anzahl der Zeichen aus. Das hat einige Vorzüge. So ist es einfach Kodierungen umzustellen (wenn man von Anfang an darauf achtet), es ist leicht verschiedenen Quelle zu kombinieren, usw.
Alles was man beachten muss ist: Alle eingehenden Daten werden dekodiert und alle Ausgehenden enkodiert. Das betrifft manchmal auch Module, wenn diese das utf8-Flag nicht beachten. (vornehmlich kompiliere also Binäre-Module)

Was nun dein konkretes Beispiel betrifft. Zuerst wandelst du die UTF-8 Bytes in das perl-interne utf8 um. Dann wandelst du das interne utf8 in ISO-8859-1. Dabei macht decode mehr als nur das utf8-flag zu setzen. Es prüft auch, ob es sich wirklich um UTF-8 Daten handelt. Es gibt zwar Möglichkeiten das Flag selber zu setzen. Das kann aber zu großen Problemen führen wenn man keine echten utf8 Daten hat. Besser ist es man benutzt CPAN:Encode

View full thread für in der MySQL-Datenbank ...