Frage

Ich habe einen PHP-Skript, das eine MSSQL2005 Datenbank zugreift, einige Daten von ihm liest und sendet die Ergebnisse in einer E-Mail.

Es gibt Sonderzeichen in beide einige Spaltennamen und in den Bereichen selbst.

Als ich das Drehbuch durch meinen Browser (Web-Server IIS) zugreifen, wird die Abfrage korrekt und der Inhalt der E-Mail ist korrekt ausgeführt (für mein Publikum) codiert. Allerdings, wenn ich PHP von der Konsole ausführen, schlägt die Abfrage fehl (aufgrund der Sonderzeichen in den Spaltennamen). Wenn ich die Sonderzeichen in der Abfrage mit Aufrufen an chr () und dem Zeichencode in Latin-1 ersetzen, wird die Abfrage korrekt ausgeführt, aber die Ergebnisse sind ebenfalls in Latin-1 und daher nicht korrekt angezeigt in der E-Mail verschlüsseln. Warum ist PHP / der MSSQL-Treiber / ... mit einer anderen Codierung in den beiden Szenarien? Gibt es eine Möglichkeit, um es?

Wenn Sie sich fragen, muss ich die Konsole, weil ich das Skript mit SQLAgent (oder Taskmanager oder was auch immer).

planen möchten
War es hilfreich?

Lösung

Je nach Art des Zeichens, die Sie in Ihrer Datenbank haben, könnte es eine Konsole Einschränkung sein, denke ich. Wenn Sie in der Konsole eingeben chcp, werden Sie sehen, was die aktive Codepage ist, das könnte so etwas wie CP437 auch als erweiterte ASCII bekannt. Wenn Sie Zeichen aus dieser Codepage haben, wie in UTF8, könnten Sie auf Probleme stoßen. Sie können die aktuelle aktive Codepage ändern chcp 65001, indem Sie auf UTF8 zu wechseln.

Sie mögen vielleicht auch in Abhängigkeit von den erforderlichen Zeichen der Standard-Raster-Schriftart Lucida Console ändern, da nicht alle Schriftarten Zeichen erweiterten Unterstützung (rechts auf Befehl klicken Aufforderungsfenster Titel, Eigenschaften, Schriftart).

Wie schon gesagt, die PHP-Unicode-Unterstützung ist nicht ideal, aber Sie können verwalten es in PHP5 mit ein paar gut platzierten Funktionsaufruf von utf8_decode . Das Geheimnis der Zeichencodierung ist gut zu verstehen, was die aktuelle Codierung von ist alle die Werkzeuge, die Sie verwenden: Datenbank, Datenbankanbindung, Strom Bytes in Ihrem PHP-Variable, die Ausgabe an die Konsole Bildschirm, E-Mail fest Körper-Codierung, Ihr E-Mail-Client, und so weiter ...

Für alles, die Sonderzeichen haben, in unserer modernen Zeit, so etwas wie UTF8 wird oft empfohlen. Stellen Sie sicher, dass alles auf dem Weg zu UTF8 gesetzt ist und wandelt nur bei Bedarf.

Andere Tipps

PHP schlechte Unterstützung für die nicht Englisch Welt ist bekannt. Ich habe noch nie eine Datenbank mit Zeichen außerhalb der ASCII-Basis Reich verwendet, aber natürlich haben Sie bereits eine Arbeit um und es scheint, man muss nur damit leben.

Wenn Sie noch einen Schritt weiter gehen wollten, könnten Sie: 1. ein Array schreiben, die alle Sonderzeichen und deren Äquivalente CHR enthält 2. foreach das Array und str_replace auf der Abfrage

Aber wenn die Abfrage hartcodiert ist, denke ich, was Sie haben, ist in Ordnung. Also, stellen Sie sicher, dass Sie die neueste PHP verwenden, zumindest 4.4.x, gibt es immer eine Änderung dieses Problem behoben wurde, aber ich entrahmte den 4.x.x Release Notes und ich sehe nichts, das Ihr Problem bezieht.

Die Sache über PHP-Strings zu erinnern ist, dass sie Ströme von Bytes sind. Wenn Sie die Daten in der richtigen Zeichensatz erhalten möchten (für was auch immer Sie tun), müssen Sie diese durch eine Art von Funktion oder Filter explizit tun. Es ist alles ziemlich Low-Level.

Je nach Konfiguration können Sie den internen Charakter der Zeichenfolgen in der Datenbank festgelegt wissen müssen, aber zumindest müssen Sie wissen, welche Zeichensatz der Datenbank wird auf PHP Senden (weil, denken Sie daran, PHP es ist nur ein Strom von Bytes).

Dann müssen Sie die Zielzeichensatz kennen (und es möglicherweise angeben, was Sie wirklich sollte sowieso). Zum Beispiel, sagen, dass Sie utf-8 aus der Datenbank erhalten, aber ich wünschte, eine Latin-1 (und damit base64 oder q-printable kodierten als 'Content-Transfer-Encoding') senden:

$send_string = base64_encode(utf8_decode($database_string));

Natürlich in diesem Fall würden Sie müssen wissen, dass all die utf-8-Zeichen gibt es in dem Latin-1-Zeichensatz, und Sie würden wahrscheinlich nicht wirklich wollen base64 (PHP leider keine gute q- hat printable Codierung Funktion, obwohl neugierig, tut es für die Decodierung), und wenn Sie sprechen nicht über utf-8 <=> Latin-1 Sie werden die mbstring Funktionen anstatt zücken wollen.

Was die Konsole, dann würden Sie müssen wissen, was PHP bekommen, wenn Sie in Sonderzeichen aus der Konsole eingeben, die auf der Schale und / oder PHP-Einstellungen hängen wahrscheinlich. Aber denken Sie daran, dass PHP nur Strings als Byte-Byte Byte versteht und Sie sollten es erarbeiten können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top