php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 20-03-2013, 18:39
freakgesicht
 Registrierter Benutzer
Links : Onlinestatus : freakgesicht ist offline
Registriert seit: Jul 2012
Beiträge: 57
freakgesicht befindet sich auf einem aufstrebenden Ast
Standard Zeichensatzproblem bei eMails

Hallo!

Ich habe folgendes Problem: Es wird durch ein Script ein html-Code in eine MySQL-Tabelle eingetragen. Später möchte ich diesen html-Code auslesen und per eMail versenden - das klappt soweit, aber leider werden Umlaute durch Fragezeichen ersetzt.

Der Zeichensatz meiner Seite lautet ISO-8859-1. Das Feld in der Datenbank, in das ich den html-Code eintrage, hat den Zeichensatz "latin1_german1_ci". Im Script, das den html-Code dann per mail() verschickt steht im Header ebenfalls "ISO-8859-1" drinnen.

ABER: wenn ich nun den Wert des Datenbankfeldes (html-Code) in eine Variable lese und per mb_detect_encoding den Zeichensatz ausgeben lasse, erhalte ich "UTF-8". Merkwürdig.

Wenn ich dann diese Variable per utf8_decode() umwandle, erhalte ich als Zeichensatz "ASCII". Die Mails sehen leider noch immer nicht besser aus.

Hat jemand eine Idee, was ich hier falsch mache?

Danke!
Mit Zitat antworten
  #2 (permalink)  
Alt 20-03-2013, 19:46
Melewo
 Registrierter Benutzer
Links : Onlinestatus : Melewo ist offline
Registriert seit: Jan 2013
Beiträge: 365
Melewo befindet sich auf einem aufstrebenden Ast
Standard

Alles was ich bisher über Umlautprobleme las, dass die Ursachen sich meistens nicht leicht zu erkennen geben. Es beginnt damit, dass eine HTML-Seite nicht nur mit einem Zeichensatz ausgezeichnet wird, sondern unter diesem Zeichensatz auch abgespeichert und notfalls vorher konvertiert werden muss. Wenn die Eingaben mit einem Formular erfolgen, wovon ich mal ausgehe, kann im Form-Tag der Zeichensatz ebenfalls ausgewiesen werden:
HTML-Code:
<form name="..." action="..." accept-charset="iso-8859-1">
Du kannst da nur schrittweise vorgehen und schauen, ab wo was schief läuft.

Geändert von Melewo (20-03-2013 um 19:52 Uhr)
Mit Zitat antworten
  #3 (permalink)  
Alt 20-03-2013, 21:21
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.595
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von freakgesicht Beitrag anzeigen
Das Feld in der Datenbank, in das ich den html-Code eintrage, hat den Zeichensatz "latin1_german1_ci".
Das ist kein Zeichensatz, sondern eine Kollation.

Zitat:
Zitat von freakgesicht Beitrag anzeigen
Im Script, das den html-Code dann per mail() verschickt steht im Header ebenfalls "ISO-8859-1" drinnen.
Verwende nicht mail(), sondern einen Mailer wie zB. PHPMailer.

Zitat:
Zitat von freakgesicht Beitrag anzeigen
ABER: wenn ich nun den Wert des Datenbankfeldes (html-Code) in eine Variable lese und per mb_detect_encoding den Zeichensatz ausgeben lasse, erhalte ich "UTF-8". Merkwürdig.
Auf welchen Zeichensatz ist deine Datenbankverbindung gesetzt?
Mit Zitat antworten
  #4 (permalink)  
Alt 20-03-2013, 21:31
freakgesicht
 Registrierter Benutzer
Links : Onlinestatus : freakgesicht ist offline
Registriert seit: Jul 2012
Beiträge: 57
freakgesicht befindet sich auf einem aufstrebenden Ast
Standard

@Melewo

Danke für deine Antwort - ich werde mir das genau ansehen.

@h3ll

Ach ja stimmt - das ist die Kollation. Hat diese irgendeinen Effekt? Kann ich einen Zeichensatz für eine MySQL-Tabelle bzw. eine Datenbank setzen?

Bezüglich Zeichensatz MySQL-Verbindung: Ich habe ehrlich gesagt noch nie davon etwas gehört, dass man hier einen Zeichensatz angeben kann. Zur Zeit verwende ich ein normales mysql_connect() und mysql_select_db() ohne eine besondere Angabe. Was muss ich hier definieren?

Danke für deine Hilfe!

Ich weiß nicht genau, wie wichtig das ist, aber in dem gleichen Script, in dem ich den html-Code in die Tabelle speichere, versende ich auch das eMail direkt an eine Mailadresse und dabei kommen die Mails korrekt dargestellt an. Also liegt es anscheinend an der Verwendung des Datenbank-Eintrags.

Weiters fällt mir noch ein zu erwähnen, dass wenn ich den html-Code in PHPMyAdmin in der Tabelle ansehe, alle Zeichen korrekt dargestellt werden. Vermutlich ist das aber nicht relevant, oder?

Geändert von freakgesicht (20-03-2013 um 21:35 Uhr)
Mit Zitat antworten
  #5 (permalink)  
Alt 20-03-2013, 21:37
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.595
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von freakgesicht Beitrag anzeigen
Ach ja stimmt - das ist die Kollation. Hat diese irgendeinen Effekt?
zB. auf die Sortierung und Vergleiche. Aber genaueres sagt dir das MySQL-Handbuch.

Zitat:
Zitat von freakgesicht Beitrag anzeigen
Kann ich einen Zeichensatz für eine MySQL-Tabelle bzw. eine Datenbank setzen?
Ja, kann man. Das hat aber keinen Einfluss auf die Zeichenkodierung der Datenbankverbindung.

Zitat:
Zitat von freakgesicht Beitrag anzeigen
Bezüglich Zeichensatz MySQL-Verbindung: Ich habe ehrlich gesagt noch nie davon etwas gehört, dass man hier einen Zeichensatz angeben kann. Zur Zeit verwende ich ein normales mysql_connect() und mysql_select_db() ohne eine besondere Angabe. Was muss ich hier definieren?
PHP: mysql_set_charset - Manual

Die mysql-Extension ist übrigens veraltet. Bei modernen PHP-Installationen ist sie nicht automatisch vorinstalliert und in zukünftigen PHP-Versionen wird sie irgendwann ganz entfernt. Wenn du also willst, dass dein Script etwas länger laufen sollen, solltest du auf eine modernere Extension wie mysqli oder PDO umstellen.
Mit Zitat antworten
  #6 (permalink)  
Alt 20-03-2013, 22:00
freakgesicht
 Registrierter Benutzer
Links : Onlinestatus : freakgesicht ist offline
Registriert seit: Jul 2012
Beiträge: 57
freakgesicht befindet sich auf einem aufstrebenden Ast
Standard

Vielen Dank für deine schnellen Antworten, h3ll!

Ich möchte mal vorerst mysql_set_charset() versuchen, um zu sehen, wo der Fehler liegt, aber danke für den Hinweis, dass die Funktion veraltet ist.

Wenn ich nun als Seitenkodierung ISO-8859-1 verwende - muss ich dann mittels mysql_set_charset() den Wert auf "ISO-8859-1" stellen? oder auf "latin1_german1_ci"?

Danke!
Mit Zitat antworten
  #7 (permalink)  
Alt 20-03-2013, 22:07
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.595
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von freakgesicht Beitrag anzeigen
Wenn ich nun als Seitenkodierung ISO-8859-1 verwende - muss ich dann mittels mysql_set_charset() den Wert auf "ISO-8859-1" stellen? oder auf "latin1_german1_ci"?
latin1_german1_ci ist eine Kollation und keine Zeichenkodierung. Hatte ich bereits gesagt.

MySQL kann kein ISO-8859-1. Es gibt die Zeichenkodierung "latin1" die CP-1252 entspricht. Diese ist annähernd gleich zu ISO-8859-1, wenn auch nicht 100% identisch. Mit dieser wirst du wahrscheinlich auskommen.

Ich würde allerdings empfehlen alles komplett auf UTF-8 umzustellen.
Mit Zitat antworten
  #8 (permalink)  
Alt 20-03-2013, 22:29
freakgesicht
 Registrierter Benutzer
Links : Onlinestatus : freakgesicht ist offline
Registriert seit: Jul 2012
Beiträge: 57
freakgesicht befindet sich auf einem aufstrebenden Ast
Standard

Okay, danke h3ll!

Ich habe es nun auf "latin1" gestellt. Leider hat sich nichts geändert - die Mails sehen aus wie vorher und wenn ich mittels mb_detect_encoding den Zeichensatz der Mail-Nachricht auslese, erhalte ich immer noch "UTF-8".

Bleibt mir nichts anderes übrig, als ganz auf UTF-8 umzustellen?

Bis jetzt habe ich es nur mit mail() versucht - funktioniert das bestimmt nicht?

Nur mal rein theoretisch: Wenn ich nun per mb_detect_encoding das Ergebnis "UTF-8" erhalte - kann ich nicht einfach damit weiter arbeiten? Was ist das Problem daran, dass ich nicht einfach eine eMail mit UTF-8-encoding versenden kann?

Danke für deine Hilfe, h3ll!!!
Mit Zitat antworten
  #9 (permalink)  
Alt 20-03-2013, 22:32
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.595
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von freakgesicht Beitrag anzeigen
Ich habe es nun auf "latin1" gestellt. Leider hat sich nichts geändert - die Mails sehen aus wie vorher und wenn ich mittels mb_detect_encoding den Zeichensatz der Mail-Nachricht auslese, erhalte ich immer noch "UTF-8".
Dann hast du es nicht richtig umgestellt. Prüfe kurz vor der Datenbankabfrage mit PHP: mysql_client_encoding - Manual ob auch wirklich die richtige Zeichenkodierung gesetzt ist.

Zitat:
Zitat von freakgesicht Beitrag anzeigen
Nur mal rein theoretisch: Wenn ich nun per mb_detect_encoding das Ergebnis "UTF-8" erhalte - kann ich nicht einfach damit weiter arbeiten? Was ist das Problem daran, dass ich nicht einfach eine eMail mit UTF-8-encoding versenden kann?
Kannst du doch. Nur musst du es im Mail-Header auch angeben.

Du solltest auch überprüfen, ob die Daten in der Datenbank auch wirklich korrekt sind. Dies geht zB. mit phpMyAdmin. Damit müssen alle Zeichen korrekt dargestellt werden, ansonsten hast du Zeichenmüll in der Datenbank.
Mit Zitat antworten
  #10 (permalink)  
Alt 20-03-2013, 22:32
freakgesicht
 Registrierter Benutzer
Links : Onlinestatus : freakgesicht ist offline
Registriert seit: Jul 2012
Beiträge: 57
freakgesicht befindet sich auf einem aufstrebenden Ast
Standard

Noch eine Frage: Muss ich im html-Code der eMail ein charset angeben? Also mittels meta-equiv...?
Mit Zitat antworten
  #11 (permalink)  
Alt 20-03-2013, 22:33
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.595
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von freakgesicht Beitrag anzeigen
Noch eine Frage: Muss ich im html-Code der eMail ein charset angeben? Also mittels meta-equiv...?
Nein, das ist nicht notwendig.
Mit Zitat antworten
  #12 (permalink)  
Alt 20-03-2013, 22:41
freakgesicht
 Registrierter Benutzer
Links : Onlinestatus : freakgesicht ist offline
Registriert seit: Jul 2012
Beiträge: 57
freakgesicht befindet sich auf einem aufstrebenden Ast
Standard

Kaum zu glauben: wenn ich vor dem Query, das den html-Code ausliest, mir mittels mysql_client_encoding() den Zeichensatz ausgeben lasse, erhalte ich "latin1".

Dann kommt das Query > dann speichere ich mir mittels mysql_fetch_array den html-Code in die Variable $message und lasse mir mittels mb_detect_encoding($message) den Zeichensatz ausgeben > dort steht "UTF-8".

Das mysql_set_charset() habe ich in jener Datei gesetzt, die die Verbindung zu MySQL herstellt - sollte also überall verfügbar sein.
Mit Zitat antworten
  #13 (permalink)  
Alt 20-03-2013, 22:43
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.595
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Dann funkt dir irgendwas dazwischen. Ohne den Code zu sehen, könnte man nur raten.
Mit Zitat antworten
  #14 (permalink)  
Alt 20-03-2013, 23:07
freakgesicht
 Registrierter Benutzer
Links : Onlinestatus : freakgesicht ist offline
Registriert seit: Jul 2012
Beiträge: 57
freakgesicht befindet sich auf einem aufstrebenden Ast
Standard

Ja, anscheinend... Hmm, beim Code gibt's nicht viel zu sehen, also:

PHP-Code:
echo "test: ",mysql_client_encoding(),"<br>";

$select_mail "SELECT message FROM mails WHERE id = '$id'";
$result mysql_query($select_mail);

while (
$row mysql_fetch_array($result))
{
  
$message $row['message'];
}

echo 
"encoding: ",mb_detect_encoding($message),"<br>"
Wie gesagt bekomme ich als Ergebnis:
test: latin1
encoding: UTF-8

Okay, angenommen ich verwende die Variable als UTF-8: Dann gebe ich im Mail-Header einfach an:
$header = 'Content-type: text/html; charset=UTF-8'.'\r\n'; ?
Mit Zitat antworten
  #15 (permalink)  
Alt 20-03-2013, 23:10
freakgesicht
 Registrierter Benutzer
Links : Onlinestatus : freakgesicht ist offline
Registriert seit: Jul 2012
Beiträge: 57
freakgesicht befindet sich auf einem aufstrebenden Ast
Standard

P.S.

Momentan verwende ich den Header genau so wie gerade gepostet, nur mit "ISO-8859-1", also:

$header = 'Content-type: text/html; charset=ISO-8859-1'.'\r\n';
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Zeichensatzproblem bei Datenbankabfrage Borsi SQL / Datenbanken 9 20-05-2011 18:19
emails bei neuen Jobs Koala Fragen/Vorschläge zum Forum 1 28-05-2009 18:37
Automatischer Subject bei Emails hokl PHP Developer Forum 5 02-03-2006 13:28
Zeichensatzproblem bei der Formulareingabe emil_der_hase PHP Developer Forum 5 04-12-2005 20:45
Flash -> PHP -> MySQL - Zeichensatzproblem? elarey SQL / Datenbanken 6 15-06-2005 14:26

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

ADSMAN V3 - Werbe-Manager ansehen ADSMAN V3 - Werbe-Manager

ADSMAN V3 - mehr als nur ein Bannermanager! Banner, Textanzeigen und PagePeel Manager! Mit ADSMAN PRO haben Sie die Marketinglösung für eine effektive und effiziente Werbeschaltung mit messbaren Ergebnissen. Unterstützt werden Bannerformate in beliebi

25.10.2018 virtualsystem | Kategorie: PHP/ Bannerverwaltung
PHP News und Artikel Script V2

News schreiben, verwalten, veröffentlichen. Dies ist jetzt mit dem neuen PHP News & Artikel System von virtualsystem.de noch einfacher. Die integrierte Multi-User-Funktion und der WYSIWYG-Editor (MS-Office ähnliche Bedienung) ermöglichen...

25.10.2018 virtualsystem | Kategorie: PHP/ News
Top-Side Guestbook

Gästebuch auf Textbasis (kein MySQL nötig) mit Smilies, Ip Sperre (Zeit selbst einstellbar), Spamschutz, Captcha (Code-Eingabe), BB-Code, Hitcounter, Löschfunktion, Editierfunktion, Kommentarfunktion, Kürzung langer Wörter, Seiten- bzw. Blätterfunktion, V

22.10.2018 webmaster10 | Kategorie: PHP/ Gaestebuch
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 16:36 Uhr.