PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : addons + sprachfiles + charset-chaos


AA_
17.04.2008, 12:12
was ich immer noch nicht so richtig verstehe, ist das handling von imports / exports in sachen addons / sprachfiles.

ich glaube auch, dass ich da einen fehler entdeckt habe, der eigentlich gar nicht passieren dürfte, da vbulletin selber die richtigen funktionen zur verfügung stellt aber nicht nutzt ;)

zunächst das problem:

unsere datenbank arbeitet mit UTF-8. exportiere ich einen addon-code, habe ich utf-encodierte strings in der datei, was erstmal korrekt ist. falsch ist hier der xml-header, der eine inhaltscodierung von iso-8859-1 vorgaukelt.

nun arbeite ich nicht mit notepad, sondern mit ide's, die u.a. automatisch die dateikodierung erkennen, allerdings unter berücksichtigung der doctypes und sonstiger meta-angaben in der datei selber. ergebnis ist, dass mir die datei in einem editor als latin1 geöffnet wird und umlaute etc. nicht wie erwartet angezeigt werden.

beispiel:
6274

dieses problem wäre leicht zu beheben, wenn beim export der daten der charset korrekt in die datei geschrieben würde und nicht immer pauschal iso-8859-1 angegeben wird. zur zeit muss ich diese datei "konvertieren" und dem editor erklären, dass er die angabe im dateiheader ignorieren soll und es sich in wahrheit um unicode-daten handelt. damit kann ich gerade noch so leben, auch wenn es schwerfällt. in der praxis ist mir soetwas auch noch nie vorgekommen und da muss man auch nicht lange drüber diksutieren. so wie derzeit ist, ist es falsch. und ich möchte nicht wissen, wieviele leute sich aufgrund dieses fehlers ihre addons / übersetzungen schon zerschossen haben.

weit schwerer wiegt aber folgendes:

halte ich mich an die unrichtige vorgehensweise beim erstellen, bearbeiten von addons oder sprachfiles und importiere ich diese über das acp wird die datei zunächst geöffnet und dann der xml-parser damit gefüttert (plugin.php, ab zeile 163):

$xmlobj = new vB_XML_Parser($xml);
(...)
if(!$arr = $xmlobj->parse())
{die methode parse() hat hier einen parameter für den charset, der aber nicht angesprochen wird (wie auch, wenn keine prüfung erfolgt vorher?):

/**
* Parses XML document into an array
*
* @param string Encoding of the inputted XML file
* @param bool Empty the XML data string after parsing
*
* @return mixed array or false on error
*/
function &parse($encoding = 'ISO-8859-1', $emptydata = true)
{oder mit anderen worten: ich lade eine utf8-codierte datei hoch, die einen falschen header hat und der xml-parser behandelt diese datei dann als iso-8859-1. das ist grottenschlecht und wahrscheinlich dem umstand geschuldet, dass vbulletin kein deutsches produkt ist und sich die entwickler ergo nicht mit umlauten herumärgern müssen und das problem nur von hörensagen kennen.

witziger weise befindet sich in der gleichen xml-klasse die "richtige" funktion! eine funktion, die sich vorher die datei ansieht, den korrekten charset ermittelt, notwendigerweise sogar konvertiert und dann an den parser schickt:

/**
* Handle encoding issues as well as parsing the XML into an array
*
* @return boolean Success
*/
function parse_xml()
{
(...)
if ($this->parse($xml_encoding))
{
(...)
statt einfach die richtige methode anzusprechen, werden in den verschiedensten foren dann haarsträubende tipps verteilt und letztlich findet sich das problem auch wieder in all den hackforen, wo einige addon-entwickler sprachfiles in 2 verschiedenen kodierungen anbieten (latin1 und unicode). das gleiche passiert übrigens auch beim import von sprachfiles: setze ich im header einer utf-8 codierten datei den utf8-charset, erlebe ich mein blaues wunder und finde dann u.U. lauter abgeschnittene phrasen in den übersetzungen wieder (ab dem ersten "ungültigen" oder inkompatiblen zeichen wird dann abgeschnitten).

vbulletin ist eine solch komplexe und durchdachte sache, aber leider mit einem totalversagen in sachen dateiexport/-import. und irgendwie fällt es mir nach so vielen jahren als programmierer schwer, einfache grundregeln zu missachten, nur damit es im produkt vbulletin halbwegs funktioniert. für nichtprogrammier in einer anderen sprache: stell dir vor, du willst kaltes wasser aus der leitung und drehst den blauen hahn auf, verbrühst dir aber ständig die hände, weil heisses wasser rauskommt. anstatt einfach die hähne auszutauschen und richtig anzuordnen, merken wir uns lieber, dass blau nicht kalt, sondern heiss ist. absurd.

und weil ich gerade beim export von daten bin: wann hört das unzulässige und chaotische vermischen von zeilenenden (LF und CRLF innerhalb einer datei) endlich mal auf?

nicht nachvollziehbare vermischung von LF und CRLF
6275

StGaensler
19.04.2008, 01:11
Hallo,

auch wenn ich mich jetzt bei einer Person unbeliebt mache (http://www.vbulletin-germany.com/forum/showthread.php?p=214674#post214674), habe ich deinen Beitrag übersetzt und als Bug gemeldet (http://www.vbulletin.com/forum/project.php?issueid=25201).

Vielen Dank,
Stefan

AA_
19.04.2008, 01:43
oh oh :D

vielen dank für den eintrag. ich denke, dass das problem nicht so leicht lösbar ist, weil dann nämlich eine abwärtskompatibilität nicht mehr gegeben ist zu all den den ganzen frickeleien der addonentwickler. du wirst mir doch zustimmen, dass es keine gute lösung ist, ein standard-latin1 kodiertes xml-file per recode oder iconv utf-8-kompatibel zu machen? ändern die programmierer das importhandling, droht dann ungemach, weil die utf8-files ja einen latin1-header haben.

deswegen regt mich das ganze ja auch auf. und vor allem ist es auch nervig, wenn man ein vbulletin mit utf8 betreiben will, weil man dann beim updaten in schwierigkeiten kommt mit dem import von latin1 sprachfiles von euch. ich habe eine ganze weile sogar utf8-tabellen mit latin1 daten versorgt, aber vergessen den charset in der config.php umzustellen. witzigerweise stimmte die ausgabe der htmlseiten, weil ich als charset iso-8859-1 angegeben habe bzw. angeben musste.

nun habe ich vor einiger zeit alles komplett auf utf8 umgestellt und trau mich kaum noch irgendein deutsches sprachfile zu importieren :)

noch ein beispiel in admin/languages.php beim exportieren von sprachen, zb. als backup oder zum bearbeiten: (zeile 192:)

$doc = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\r\n\r\n";ausgelesen werden bei mir utf-8 encodierte daten, da der mysql-client mit utf-8 auf die db losgeht. abhilfe könnte doch schon mal sein, dass man hier an dieser stelle "UTF-8" reinschreibt, wenn jemand die in der config angegeben hat und die tabellen utf-8 kodiert sind und der html-header bei der ausgabe ebenfalls utf-8 ist (so muss es sein, wenn man das vbulletin mit utf8 sauber betreiben will).

das sprachfile, was ich mir im adminpanel runterlade, ist quasi für die mülltonne.

beim importieren der sprachfiles das gleiche:

adminfunctions_language.php; xml_import_language(); zeile 396:

if(!$arr =& $xmlobj->parse())

// nachtrag: es ist kein vbulletin 3.7 fehler, sondern schon immer so. kompliziert ist es aber geworden, seit man charsets einstellen kann.

StGaensler
19.04.2008, 01:56
Hallo,

ja, ich stimme dir da zu, dass das keine gute Lösung ist. Aber die Abwärtskompatibilität ist schon durch andere Sachen kaputt gegangen, so kannst du z.B. keine Add-Ons von vB 3.6 in vB 3.5 importieren, da das neu dazugekommene Feld "executionorder" meinen Erinnerungen nach sogar einen SQL-Fehler produziert. Auf vB 3.7 könnte man auch wieder so einen Schritt machen ;)
Ich will aber nicht versprechen, dass das bis zu Gold-Version korrigiert wird, die steht meines Erachtens schon zu sehr vor der Tür.

Viele Grüße,
Stefan

StGaensler
21.04.2008, 15:52
Übersetzung der Antwort von Mike Sullivan (http://www.vbulletin.com/forum/project.php?issueid=25201#note60989)falsch ist hier der xml-header, der eine inhaltscodierung von iso-8859-1 vorgaukelt.Nein, der Zeichensatz des XML-Headers ist korrekt. Für die verschiedenen Benutzer unter PHP 4 und PHP 5 müssen wir sehr viele Zeichensätze unterstützen. Wenn man berücksichtigt, dass ISO-8859-1 unter Berücksichtigung der Bytes eine Obermenge von UTF-8 ist, kann man dies verstehen.

Ja, das stellt ein Problem dar, wenn du diese Datei bearbeiten willst, aber in erster Linie ist diese Datei für den Vertrieb gedacht.

Dies werden wir nicht vor vBulletin 4 ändern.

AA_
28.04.2008, 11:37
Übersetzung der Antwort von Mike Sullivan (http://www.vbulletin.com/forum/project.php?issueid=25201#note60989)Nein, der Zeichensatz des XML-Headers ist korrekt. Für die verschiedenen Benutzer unter PHP 4 und PHP 5 müssen wir sehr viele Zeichensätze unterstützen. Wenn man berücksichtigt, dass ISO-8859-1 unter Berücksichtigung der Bytes eine Obermenge von UTF-8 ist, kann man dies verstehen.

Ja, das stellt ein Problem dar, wenn du diese Datei bearbeiten willst, aber in erster Linie ist diese Datei für den Vertrieb gedacht.

Dies werden wir nicht vor vBulletin 4 ändern.

ich bin mir nicht ganz sicher, ob die herren das problem erfasst haben oder aus der nummer zu diesem zeitpunkt nicht mehr so einfach rauskommen.

das grundübel liegt darin, dass man sich für die distribution(en) einen charset herausgesucht hat, der für eine internationalisierung der software gänzlich ungeeignet ist. ja es ist wahr, dass die zeichen von iso-8859-1 eine untermenge von utf-8 sind, aber was will mir das sagen? die einzige antwort lautet: "weil die zeichen von iso-8850-1 eine untermenge von utf-8 sind, wäre es richtig, wenn wir tatsächlich ab sofort die releasefiles in utf-8 codieren.".

dann nämlich steht im xml-header immer utf-8 und die zeichen der jeweiligen sprache wären bis auf ganz wenige ausnahmen von fernöstlichen sprachen vollkommen schnurze. das wäre dann idealerweise genau das, was der gemeine anwender von einer import- oder installationsroutine erwartet.

merkwürdigerweise sind die funktionen dafür in der software vorhanden, aber entweder haben die schiss, den schalter umzulegen oder nicht wirklich ahnung von der materie - und das (halbwissen) muss ich nach der antwort leider unterstellen.

im übrigen: das update für die blogsoftware ist ein offizielles release. die aussage der entwickler ist falsch. ich konnte das update nur korrekt einspielen durch eine vorherige konvertierung des mitgelieferten sprachfiles.

Andreas
28.04.2008, 12:24
vBulletin ist nicht voll UTF-8 kompatibel und wird es vor 4.0 wohl auch nicht sein (dafür sind die nötigen Änderungen viel zu umfangreich).
Das dürfte aber für die allerwenigsten User ein Problem darstellen - die mitgelieferten Standard-Sprachen sind Windows-1252.

Wenn Du komplett UTF-8 fahren möchtest musst Du die Files (wie bereits festgestellt) konvertieren.

StGaensler
28.04.2008, 17:30
ja es ist wahr, dass die zeichen von iso-8859-1 eine untermenge von utf-8 sind, aber was will mir das sagen?Mike sagt aber nicht das, was du hier wiedergibtst. Es ist korrekt, dass der Zeichenvorrat von UTF-8 größer ist, als der Zeichenvorrat von ISO-8859-1. Mike argumentiert allerdings andersherum: Im Byte-Vorrat von ISO-8859-1 lässt sich auch UTF-8 abbilden, andersherum geht das aber nicht. Das liegt daran, dass in UTF-8 ein Zeichen bis zu vier Byte groß sein kann, und es für Zeichen, welche mehrere Bytes belegen, spezielle Regeln gibt, z.B. diese: Das erste Byte enthält binär 11xxxxxx, die folgenden Bytes 10xxxxxx; die x stehen für die fortlaufende Bitkombination des Unicode-Zeichens. Die Anzahl der Einsen vor der höchsten 0 im ersten Byte ist die Anzahl der Bytes für das Zeichen.Noch unterstützt auch PHP UTF-8 nicht nativ (das tut es erst ab PHP 6) was die Angelegenheit vermutlich auch noch ein wenig schwerer macht.

Viele Grüße,
Stefan

AA_
28.04.2008, 19:48
das ist aber arg weit hergeholt und nicht das thema. schau dir mal den beitrag http://www.vbulletin-germany.com/forum/showthread.php?t=35858 in der datenbank an und dann reden wir über bytes, wenn du magst :)

s.molinari
29.04.2008, 08:12
Hi,

Ich habe mit Kier, der Projektmanager und Hauptentwickler, über dieses Problem gesprochen und er hat gesagt, erst mit vB 4.0 wird das UTF-8 bzw. allgemein das Kollation/ Charset Thema korrekt gehandelt und er hat 3 Monaten :eek: Entwicklungszeit im vB4 Projekt dafür eingeplant.

Mit anderen Worten, das Problem wird für 3.7.X definitiv nicht korrigiert. Sorry.

Scott

AA_
29.04.2008, 09:02
das freut mich zu hören. 3 monate mögen viel klingen - ist aber durchaus realistisch angesetzt bei der komplexität der erforderlichen änderungen. belohnt wird das durch wesentlich mehr speed, denn dann können endlich die ganzen mechanismen entfallen, wo teilweise jedes der oben angesprochenen bytes einzeln durch die mangel gedreht werden muss ;)

bis dahin wursteln wir eben noch ein bisschen vor uns hin :D