Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Umgang mit Sonderzeichen bei PHP und SQL (https://www.delphipraxis.net/129974-umgang-mit-sonderzeichen-bei-php-und-sql.html)

Synollus 28. Feb 2009 22:25


Umgang mit Sonderzeichen bei PHP und SQL
 
Hallo,

ich sitze gerade an einem neuen Projekt und benötige dafür PHP und SQL-Datenbanken. Ich hatte immer Ärger mit den Sonderzeichen, diesmal will es aber von Vorneherein richtig machen. :D

Ich möchte über ein Textarea / Input etwas mit PHP und SQL in die Datenbank schreiben, genauso wie es dadrin steht. Und genauso möchte ich es auch ausgeben. Also auch die Sonderzeichen sollen problemlos ausgegeben werden.

Jetzt bietet PHP die Möglichkeit die Sonderzeichen vorher in Codes o.ä. umzuwandeln, aber wann ich welche Funktion benutzen soll, weiß ich immer noch nicht. :D

Wie löst ihr das? Unter Sonderzeichen verstehe ich alles, was sich auf einer normalen QWERTZ-Tastatur befindet (von ä, ö, ü über $ § %, etc.)

Meflin 28. Feb 2009 22:29

Re: Umgang mit Sonderzeichen bei PHP und SQL
 
Ganz einfach: Den Text, der Sonderzeichen enthält (und der vom Benutzer eingegeben wird), musst du mittels htmlentities umwandeln. htmlentities macht dann Beispielsweise &auml aus ä. Diesen umgewandelten Text speicherst du in der Datenbank. Bei der Ausgabe musst du dann nix weiter beachten.

Theoretisch kannst du auch den originalen Text speichern. Dann musst du aber bei jeder Ausgabe htmlentities aufrufen, was natürlich insgesamt gesehen einen höheren Rechenaufwand (= Kosten) bedeutet.

Synollus 28. Feb 2009 22:31

Re: Umgang mit Sonderzeichen bei PHP und SQL
 
Okay, verstanden habe ich es, danke. :D

Ich bin mal gespannt, ob das auch so prima funktioniert. :D Den Befehl kenne ich ja schon, aber ich hatte damals trotzdem Probleme mit " oder '

alcaeus 28. Feb 2009 22:35

Re: Umgang mit Sonderzeichen bei PHP und SQL
 
Text in Entities umzuwandeln ist generell eine dumme Idee. Denn nicht immer muss der Output HTML-Encoded sein, mal ganz davon abgesehn dass es absolut unnoetig ist.

Achte darauf, dass deine Datenbank, die Verbindung zur Datenbank und die HTML-Seite alle dieselbe Zeichencodierung verwenden, und du wirst keine Probleme haben ;)

Greetz
alcaeus

Synollus 28. Feb 2009 22:54

Re: Umgang mit Sonderzeichen bei PHP und SQL
 
Zitat:

Zitat von alcaeus
Achte darauf, dass deine Datenbank, die Verbindung zur Datenbank und die HTML-Seite alle dieselbe Zeichencodierung verwenden, und du wirst keine Probleme haben ;)

Sofern ich das jetzt richtig verstanden habe, soll die Kollation der Datenbank dieselbe sein wie der/das charset in den Meta-Daten?

Dann gehen wir doch mal davon aus, dass in der HTML-Seite diese "Standard"-Zeile steht:

Code:
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
In der DB habe ich sowas nicht zum auswählen. Standard ist i.d.R. "latin1_swedish_ci". Mein Gefühl sagt ich sollte eher "utf8_unicode_ci" verwenden. :mrgreen:

Was ist denn nun das richtige? :stupid:

EDIT: War gestern abend schon ein bisschen spät :p "charset=utf-8" und "utf8_unicode_ci" müsste klappen, oder?

mjustin 1. Mär 2009 07:45

Re: Umgang mit Sonderzeichen bei PHP und SQL
 
Zitat:

Zitat von Synollus
Zitat:

Zitat von alcaeus
Achte darauf, dass deine Datenbank, die Verbindung zur Datenbank und die HTML-Seite alle dieselbe Zeichencodierung verwenden, und du wirst keine Probleme haben ;)

Sofern ich das jetzt richtig verstanden habe, soll die Kollation der Datenbank dieselbe sein wie der/das charset in den Meta-Daten?

Dann gehen wir doch mal davon aus, dass in der HTML-Seite diese "Standard"-Zeile steht:

Code:
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
In der DB habe ich sowas nicht zum auswählen. Standard ist i.d.R. "latin1_swedish_ci". Mein Gefühl sagt ich sollte eher "utf8_unicode_ci" verwenden. :mrgreen:

Was ist denn nun das richtige? :stupid:

EDIT: War gestern abend schon ein bisschen spät :p "charset=utf-8" und "utf8_unicode_ci" müsste klappen, oder?

Ja, UTF-8 ist empfehlenswert, wenn man sich nicht nur auf z.B. westeuropäische Sonderzeichen beschränken will.

Delphi-Quellcode:
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
Zeichen, die ausserhalb des ASCII-Bereichs liegen, kann man dann entweder UTF-8 kodiert, oder in numerischer Notation in die HTML Datei schreiben.

http://de.selfhtml.org/html/referenz...tm#allgemeines

In Selfhtml wird noch ein pikanter Hinweis gegeben:

Zitat:

Im Konfliktfall, also wenn der Webserver im HTTP-Header eine hiervon abweichende Angabe sendet, wird üblicherweise die Angabe des HTTP-Headers verwendet.
http://de.selfhtml.org/html/kopfdate...ichenkodierung

Bernhard Geyer 1. Mär 2009 10:13

Re: Umgang mit Sonderzeichen bei PHP und SQL
 
Verwende auf DB-Ebene und soweit möglich auf PHP-Ebene Unicode und erst zur Anzeie HTML und du wirst du wenigesten Probleme.

alcaeus 1. Mär 2009 14:13

Re: Umgang mit Sonderzeichen bei PHP und SQL
 
Moin,

mit UTF-8 oder UTF-16 faehrst du heutzutage am geschicktesten. Beachte aber, dass PHP keine Multibyte-Strings kennt, das funktioniert erst in PHP 5.3 oder sogar erst PHP 6. Das hat zur Folge dass z.B. strlen() bei Multibyte-Strings falsche Ergebnisse liefert. Es gibt allerdings die mb_string-Extension, die mit Multibyte-Strings umgehn kann.

Was das andere charset betrifft: iso-8859-1 ist auch als latin1 bekannt, du koenntest also latin1_binary verwenden. Beachte bei der Collation also auch, dass saemtliche Charsets mit einem _ci am Ende case-insensitive sind, da ist Matze letztens schon drueber gestolpert ;)

Ansonsten kann ich Bernhard nur zustimmen - HTML hat erst ausserhalb der DB was zu suchen. In der DB solltest du allerhoechstens eingegebenen HTML-Code mit htmlspecialchars() entschaerfen, damit du das nicht bei jedem Anzeigen machen musst.

Greetz
alcaeus

Synollus 1. Mär 2009 15:49

Re: Umgang mit Sonderzeichen bei PHP und SQL
 
Zitat:

Zitat von alcaeus
Moin,

mit UTF-8 oder UTF-16 faehrst du heutzutage am geschicktesten. Beachte aber, dass PHP keine Multibyte-Strings kennt, das funktioniert erst in PHP 5.3 oder sogar erst PHP 6. Das hat zur Folge dass z.B. strlen() bei Multibyte-Strings falsche Ergebnisse liefert. Es gibt allerdings die mb_string-Extension, die mit Multibyte-Strings umgehn kann.

Was das andere charset betrifft: iso-8859-1 ist auch als latin1 bekannt, du koenntest also latin1_binary verwenden. Beachte bei der Collation also auch, dass saemtliche Charsets mit einem _ci am Ende case-insensitive sind, da ist Matze letztens schon drueber gestolpert ;)

Ansonsten kann ich Bernhard nur zustimmen - HTML hat erst ausserhalb der DB was zu suchen. In der DB solltest du allerhoechstens eingegebenen HTML-Code mit htmlspecialchars() entschaerfen, damit du das nicht bei jedem Anzeigen machen musst.

Greetz
alcaeus

Ich danke euch erstmal. :D Klappt alles prima mit UTF-8. Ich speicher in der DB ja nur kleine Formatierungen wie [b], <u>, [i],
, etc. zum Formatieren von News, etc.

Der Header der HTML-Seite sieht momentan so aus:

Code:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
 [...]
</head>
Wenn ich jetzt auf der Seite direkt "Ä" (also ohne &Auml; im Body-Bereich) eingebe, kommt bei Schwarzer Schrift auf weißem Hintergrund im FF eine schwarze Raute mit weißem Fragezeichen und im IE ein weißes Rechteck mit schwarzem Rahmen raus. Liegt das jetzt daran, dass die Datei auf meinem lokalen Rechner (XAMPP) ASCII-codiert ist? :?

alcaeus 1. Mär 2009 20:16

Re: Umgang mit Sonderzeichen bei PHP und SQL
 
Zitat:

Zitat von Synollus
Wenn ich jetzt auf der Seite direkt "Ä" (also ohne &Auml; im Body-Bereich) eingebe, kommt bei Schwarzer Schrift auf weißem Hintergrund im FF eine schwarze Raute mit weißem Fragezeichen und im IE ein weißes Rechteck mit schwarzem Rahmen raus. Liegt das jetzt daran, dass die Datei auf meinem lokalen Rechner (XAMPP) ASCII-codiert ist? :?

Richtig. Eine Datei, welche im Latin1-Zeichensatz gespeichert ist, wird immer komische Sachen anzeigen. Speichere die Datei als UTF-8 und es geht wunderbar :)

Greetz
alcaeus


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz