Umwandlung von Sonderzeichen

schiese

Erfahrenes Mitglied
Hallo,
ich habe ein Problem mit der Umwandlung von Schriftzeichen und Sonderzeichen. Ich trage meine Daten wie folgt in die Datenbank ein:
PHP:
htmlspecialchars($_POST['antwort']);
$query = "INSERT INTO tabelle VALUES(mysql_real_escape_string($_POST['antwort'])";

und gebe die Daten wie folgt aus:
PHP:
<html>
<head>
<title></title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>

.................

echo nl2br(smileys(zeichenfiltern($arraybeitraege['inhalt'])));

function zeichenfiltern($text)
{
 if(get_magic_quotes_gpc())
 {
  return stripslashes($text);
 }
 else
 {
  return $text;
 }
}

..............

</body>
</html>

Alle Sonderzeichen werden auch gut umgewandelt, nur wenn ich jetzt mit kyrillischen Schriftzeichen schreiben möchte, gibt er mir folgendes aus:

& #1087;& #1088;& #1080;& #1074;& #1077;& #1090;


Wie kriege ich es hin, das er die "&-Zeichen" in dem Fall nicht umwandelt?

schiese
 
Zuletzt bearbeitet:
Hi,
danke für deine Antwort. Hier die Struktur der Datenbank:
Code:
CREATE TABLE `forumtabelle` (
`id` INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`art` VARCHAR( 5 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL ,
`autorid` INT( 10 ) NOT NULL ,
`zeit` INT( 20 ) NOT NULL ,
`gruppenid` VARCHAR( 125 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL ,
`ueberschrift` VARCHAR( 100 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL ,
`inhalt` VARCHAR( 20000 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL ,
`aenderung` INT( 20 ) NOT NULL ,
`gesperrt` VARCHAR( 5 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_unicode_ci;

schiese
 
Kannst du den Source von smileys() noch posten? Vermutlich liegt dort der Hund begraben.
 
Zuletzt bearbeitet:
hier der Code:
PHP:
function smileys ($text) {
	$suchen[0] = ":-)";
	$suchen[1] = ":-D";
	$suchen[2] = ":-(";
	$suchen[3] = ":-o";
	$suchen[4] = "8-O";
	$suchen[5] = ":-?";
	$suchen[6] = "8-)";
	$suchen[7] = ":lol:";
	$suchen[8] = ":-x";
	$suchen[9] = ":-P";

	$suchen[10] = ":oops:";
	$suchen[11] = ":cry:";
	$suchen[12] = ":evil:";
	$suchen[13] = ":twisted:";
	$suchen[14] = ":roll:";
	$suchen[15] = ";-)";
	$suchen[16] = ":!:";
	$suchen[17] = ":idea:";
	$suchen[18] = ":-|";
	$suchen[19] = ":mrgreen:";

	$ersetzen[0] = "<img src='smileys/icon_smile.gif' border='0' alt=':-)'>";
	$ersetzen[1] = "<img src='smileys/icon_biggrin.gif' border='0' alt=':-D'>";
	$ersetzen[2] = "<img src='smileys/icon_nosmile.gif' border='0' alt=':-('>";
	$ersetzen[3] = "<img src='smileys/icon_eek.gif' border='0' alt=':-o'>";
	$ersetzen[4] = "<img src='smileys/icon_shocked.gif' border='0' alt='8-O'>";
	$ersetzen[5] = "<img src='smileys/icon_confused.gif' border='0' alt=':-?'>";
	$ersetzen[6] = "<img src='smileys/icon_cool.gif' border='0' alt='8-)'>";
	$ersetzen[7] = "<img src='smileys/icon_lol.gif' border='0' alt=':lol:'>";
	$ersetzen[8] = "<img src='smileys/icon_mad_GREEN.gif' border='0' alt=':-x'>";
	$ersetzen[9] = "<img src='smileys/icon_razz.gif' border='0' alt=':-P'>";

	$ersetzen[10] = "<img src='smileys/icon_blush.gif' border='0' alt=':-P'>";
	$ersetzen[11] = "<img src='smileys/icon_frown.gif' border='0' alt=':-P'>";
	$ersetzen[12] = "<img src='smileys/icon_twistedevil2.gif' border='0' alt=':-P'>";
	$ersetzen[13] = "<img src='smileys/icon_twistedevil1.gif' border='0' alt=':-P'>";
	$ersetzen[14] = "<img src='smileys/icon_rolleyes.gif' border='0' alt=':-P'>";
	$ersetzen[15] = "<img src='smileys/icon_wink2.gif' border='0' alt=':-P'>";
	$ersetzen[16] = "<img src='smileys/icon_exclaim2.gif' border='0' alt=':-P'>";
	$ersetzen[17] = "<img src='smileys/icon_idea2.gif' border='0' alt=':-P'>";
	$ersetzen[18] = "<img src='smileys/icon_neutral.gif' border='0' alt=':-P'>";
	$ersetzen[19] = "<img src='smileys/icon_mrgreen.gif' border='0' alt=':-P'>";
	
	$fertigertext = str_replace($suchen, $ersetzen, $text);
	return $fertigertext;
}

schiese
 
Wenn ich htmlspecialchars() entferne geht es mit den kyrillischen Schriftzeichen, aber die Sonderzeichen werden dann natürlich nicht mehr umgewandelt.

Gibt es sonst andere Funktionen, die man alternativ verwenden kann?

schiese
 
Rufst du htmlspecialchars() mit dem richtigen Charset auf? Also bspw.

PHP:
$string = htmlspecialchars($string, ENT_NOQUOTES, "UTF-8");
 
Hi,
habe ich auch schon versucht, bringt aber nichts.
Er wandelt irgendwie das kaufmännische Und-Zeichen von & #1093; schon um, so dass im Quelltext & amp;#1093; steht.

schiese
 
Moin,

Wenn ich htmlspecialchars() entferne geht es mit den kyrillischen Schriftzeichen[...]

htmlspecialchars() und nl2br() haben beim Eintragen in die Datenbank nichts zu suchen (falls du das mit dem "Entfernen von htmlspecialchars" meintest). Diese kannst du bei einer Ausgabe verwenden. Dies ist in den meisten Fällen - zumindest bei htmlspecialchars - aber auch nicht notwenig!

Gruß
 
Habe es jetzt hinbekommen.
Meine nächste Frage ist nun, ob das Skript so auch sicher ist, oder ob es ein leichtes ist, schädlichen Code auszuführen.

PHP:
<?php
session_start();
header('Content-Type: text/html; charset=utf-8'); 

.........................

	if (preg_match('/[^0-9a-Z]/i', $_POST['gruppe'])) {
	echo "Dieses Thema ist leider nicht vorhanden!";
	} else {  // Gruppe besteht nur aus Buchstaben und Zahlen

.............................................

$antwort = addslashes($_POST['antwort']);

$equery = "INSERT INTO forumtabelle VALUES (NULL,'A','".mysql_real_escape_string($_SESSION['user'])."','$zeit','".mysql_real_escape_string($_POST['gruppe'])."','','".mysql_real_escape_string($antwort)."','','')";

...................

?>

PHP:
<?php
session_start();
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<title></title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>

<?php
if (isset($_GET['gruppe'])) {
	
	if (preg_match('/[^0-9a-z]/i', $_GET['gruppe'])) {
	echo "Dieses Thema ist leider nicht vorhanden!";
	} else {
	
include("mysqldaten.php");
$db = mysql_connect($serverdb,$userdb,$passwortdb) Or die ("Keine Verbindung zur Datenbank!");
mysql_select_db($datenbankdb) Or die (mysql_error());

$query = "SELECT * FROM forumtabelle WHERE gruppenid = '".mysql_real_escape_string($_GET['gruppe'])."'";
$query2 = mysql_query($query) Or die(mysql_error());

$a = 1;
while($arraybeitraege = mysql_fetch_assoc($query2)) {
echo $a.":<br>";
	echo nl2br(smileys(zeichenfiltern(htmlspecialchars(stripslashes($arraybeitraege['inhalt'])))));
echo "<hr><br>";	
$a++;
} // While-Ende

?>
</body>
</html>

schiese
 
Zurück