Supportnet / Forum / Skripte(PHP,ASP,Perl...)
kein Cookie bei PHP und UTF8-Zeichenformat
Frage
Hallo, muß auch mal ne frage loßwerden.
Also da ich auf einer PHP-Seite Japanische Zeichen unterbringen möchte, muß ich die Text-Datei als UTF8 Speichern (Siehe Notepad, Speichern unter)
das Problem ist das im Notepad unsichtbar 3 Bytes am anfang der Datei stehen die dafür sorgen das jeder versuch ein Cookie zu setzen zu der Meldung führt "Headers allready sent".
Ich löse das Problem etwas weniger elegant dadurch das ich die php-datei als normale ANSI-Textdatei speichere.
Nach den Cookies und vor der 1. ausgabe von Text diese 3 Zeichen von Hand ausgebe, einfach mit
echo chr(239).chr(187).chr(191);
Die Japanischen Zeichen kann ich dann aber nicht in die gleiche datei tun da diese beim speichern als ANSI-Text zerstört werden. Also lese ich aus der als ANSI gespeicherten PHP-Datei nun eine als UTF8 gespeicherte Text-Datei, ab dem 4 Zeichen und gebe das mit echo aus.
Sehr umständlich, aber evtl gibts ja eine andere Möglichkeit ohne die Maskierung aller Zeichen mit .....; den Text vernünftig auszugeben.
Ich vermute da ich der einzig wahnsinnige bin der sowas tut wird kaum jemand antworten, bitte nur ernst gemeinte vorschläge. Am besten ne möglichkeit PHP zu überreden diese 3 zeichen nicht vor dem Header auszugeben.
Antwort 1 von MixMax
OK, ich versuchs nochmal.
werde eh noch nicht so schnell damit fertig.
werde eh noch nicht so schnell damit fertig.
Antwort 2 von semi
Was hälst Du davon, die UTF-8-Strings in Base64 zu konvertieren?
So kodierte Strings kannst Du dann auch in ANSI speichern.
Die Ausgabe könntest Du dann in eine Funktion auslagern, die base64 wieder in utf-8 konvertiert und ausgibt.
Liegt es nur am Editor (Notepad ist doch ein Witz)? Hast Du auch andere versucht?
Im PHP-Handbuch steht auch etwas über japanische Zeichensätze und UTF-8.
Guckst Du hier
Ich hoffe, dass ich helfen konnte. :)
Gruß,
Michael
So kodierte Strings kannst Du dann auch in ANSI speichern.
Die Ausgabe könntest Du dann in eine Funktion auslagern, die base64 wieder in utf-8 konvertiert und ausgibt.
Liegt es nur am Editor (Notepad ist doch ein Witz)? Hast Du auch andere versucht?
Im PHP-Handbuch steht auch etwas über japanische Zeichensätze und UTF-8.
Guckst Du hier
Ich hoffe, dass ich helfen konnte. :)
Gruß,
Michael
Antwort 3 von MixMax
Danke semi,
ich schaue mal nach möglichkeiten das so zu automatisieren das ich nicht 700 wörter und deren lautschriftumschreibung von hand machen muß.
Die texte stehen ja nicht im notepad sondern in sql.
ich schaue mal nach möglichkeiten das so zu automatisieren das ich nicht 700 wörter und deren lautschriftumschreibung von hand machen muß.
Die texte stehen ja nicht im notepad sondern in sql.
Antwort 4 von semi
Kann es nicht ein Transportproblem zwische mySQL und PHP sein?
Wenn ich mir die INI-Datei von der "Standard"-Installation von mySQL anschaue, dann sehe ich unter character-sets kein utf-8.
Wenn ich mir die INI-Datei von der "Standard"-Installation von mySQL anschaue, dann sehe ich unter character-sets kein utf-8.
Antwort 5 von MixMax
habs gelöst... habe durch ein php-script die daten von dem alten format (Shift JIS, nicht unicode oder base64 oder so) nach UTF8 konvertiert.
hier ein abdruck der 3 scripte (die ca 2 stunden gebraucht haben, aber dafür sauber gearbeitet haben).
Wenn man in der Quell/Zieldatei das format ändert kann man Datenbank-spalten von jeder in jede Zeichenkodierung umwandeln:
Hauptdatei (Steuert de Vorgang)
Die Datei ließt die daten in ein Formular und gibt der Hauptdatei bescheid wenn es geladen ist.
Diese Datei gibt erst bescheid wenn das Leere formular geladen wurde, die Hauptdatei kopiert die daten des einen Frames dann in dieses und gibt den absendebefehl. Diese Datei meldet sich dann wieder anders wenn das formular verarbeitet wurde.
ja...etwas unkonventionell... ich hoffe das die änderungen durch das SN-Script es nicht mehr kapput machen. einige zeilenumbrüche müssen nachträglich entfernt werden (wo ein _ am ende ist).
Um ein überblick zu behalten welche spalten umgewandelt wurden (sollte das script abbrechen) wird eine Spalte benötigt mit dem namen konvertiert (Bit, default 0).
hier ein abdruck der 3 scripte (die ca 2 stunden gebraucht haben, aber dafür sauber gearbeitet haben).
Wenn man in der Quell/Zieldatei das format ändert kann man Datenbank-spalten von jeder in jede Zeichenkodierung umwandeln:
Hauptdatei (Steuert de Vorgang)
<html>
<head>
<title>ShiftJIS -> UTF8 Konverter</title>
<script type="text/javascript">
<!--
var QFormloaded = 0;
var ZFormloaded = 0;
var Submitdone = 2;
var e = -1;
var NoList = new Array(<?php
$Result = mysql_query("use datenbank");
$Result = mysql_query("select id from vokabeln where konvertiert = 0;");
$NoList = array();
while ($Data = mysql_fetch_array($Result))
array_push($NoList, $Data['id']);
if (count($NoList)>0) echo "'".join("', '", $NoList)."'";
?>);
function dosomething() {
if (Submitdone == 2) {
e++;
if (e>=NoList.length) {
Stop();
}
else {
Submitdone = 0;
QFormloaded = 0;
ZFormloaded = 0;
top.Quelle.location.href='conquelle.php?id='+NoList[e];
top.Ziel.location.href = 'conziel.php?id=' + NoList[e];
}
}
CheckSubmitReady();
}
function CheckSubmitReady() {
if (ZFormloaded==1&&QFormloaded==1&&Submitdone==0) {
top.Ziel.Formular.feld1.value = top.Quelle.Formular.feld1.value;
top.Ziel.Formular.feld2.value = top.Quelle.Formular.feld2.value;
top.Ziel.Formular.feld3.value = top.Quelle.Formular.feld3.value;
top.Ziel.Formular.feld4.value = top.Quelle.Formular.feld4.value;
top.Ziel.Formular.feld5.value = top.Quelle.Formular.feld5.value;
top.Ziel.Formular.id.value = NoList[e];
Submitdone = 1;
top.Ziel.Formular.submit();
}
}
function Status() {
alert("QReady:"+QFormloaded+"\nZReady:"+ZFormloaded+"\nSubmitstate:"+Submitdone);
}
function Stop() {
window.clearInterval(Intervalle);
}
function Weiter() {
Intervalle = window.setInterval('dosomething();', 1000);
}
Weiter();
//-->
</script>
</head>
<frameset rows="250,*">
<frame name="Quelle" src="conquelle.php?init=1">
<frame name="Ziel" src="conziel.php?init=1">
</frameset>
</html>
Die Datei ließt die daten in ein Formular und gibt der Hauptdatei bescheid wenn es geladen ist.
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Quelldatei</title>
</head>
<body onload="<?php
if (isset($_GET['init'])) {
}
else
echo "top.QFormloaded = 1;";
?>"><a href="javascript:top.Status();">Status</a>
<a href="javascript:top.Stop();">Stop</a>
<a href="javascript:top.Weiter();">Weiter</a><br>
<?php
if ((isset($_GET['id']) and is_numeric($_GET['id']) and is_integer(1*$_GET['id']) _
and $_GET['id'] >= 0 and $_GET['id'] <= 9999) or (isset($_POST['id']) and _
is_numeric($_POST['id']) and is_integer(1*$_POST['id']) and _
$_POST['id'] >= 0 and $_POST['id'] <= 9999)) {
$Result = mysql_query("use datenbank");
$Result = mysql_query("select feld1, feld2, feld3, feld4, feld5 from vokabeln _
where id='".$_GET['id']."';");
$Data = mysql_fetch_array($Result);
?><h2><?= $_GET['id'] ?>
</h2>
<form name="Formular">
<input name="feld1" value='<?= $Data['feld1'] ?>'><br>
<input name="feld2" value='<?= $Data['feld2'] ?>'><br>
<input name="feld3" value='<?= $Data['feld3'] ?>'><br>
<input name="feld4" value='<?= $Data['feld4'] ?>'><br>
<input name="feld5" value='<?= $Data['feld5'] ?>'>
</form>
<?php
}
?> </body>
</html>
Diese Datei gibt erst bescheid wenn das Leere formular geladen wurde, die Hauptdatei kopiert die daten des einen Frames dann in dieses und gibt den absendebefehl. Diese Datei meldet sich dann wieder anders wenn das formular verarbeitet wurde.
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=Shift_JIS">
<title>Zieldatei</title>
</head>
<body onload="<?php
if (isset($_GET['init'])) {
}
else if (!isset($_POST['id']))
echo "top.ZFormloaded = 1;";
else
echo "top.Submitdone = 2;";
?>"><a href="javascript:top.Status();">Status</a>
<a href="javascript:top.Stop();">Stop</a>
<a href="javascript:top.Weiter();">Weiter</a><br>
<?php
if ((isset($_GET['id']) and is_numeric($_GET['id']) and is_integer(1*$_GET['id']) _
and $_GET['id'] >= 0 and $_GET['id'] <= 9999) or (isset($_POST['id']) and _
is_numeric($_POST['id']) and is_integer(1*$_POST['id']) and _
$_POST['id'] >= 0 and $_POST['id'] <= 9999)) {
if (isset($_POST['id'])) {
$Result = mysql_query("use datenbank");
mysql_query("update vokabeln set konvertiert=1, feld1='".$_POST['feld1']."', _
feld2='".$_POST['feld2']."', feld3='".$_POST['feld3']."', feld4 _
='".$_POST['feld4']."', feld5='".$_POST['feld5']."' where id='" _
.$_POST['id']."';");
echo "gespeichert: ".mysql_affected_rows();
}
?><form name="Formular" action="conziel.php" method="POST">
<input name="id"<?php
if (isset($_POST['id']))
echo " value='".$_POST['id']."'";
?>><br>
<input name="feld1"<?php
if (isset($_POST['feld1']))
echo " value='".$_POST['feld1']."'";
?>><br>
<input name="feld2"<?php
if (isset($_POST['feld2']))
echo " value='".$_POST['feld2']."'";
?>><br>
<input name="feld3"<?php
if (isset($_POST['feld3']))
echo " value='".$_POST['feld3']."'";
?>><br>
<input name="feld4"<?php
if (isset($_POST['feld4']))
echo " value='".$_POST['feld4']."'"; ?>><br>
<input name="feld5"<?php
if (isset($_POST['feld5']))
echo " value='".$_POST['feld5']."'";
?>>
</form>
<?php
}
?> </body>
</html>
ja...etwas unkonventionell... ich hoffe das die änderungen durch das SN-Script es nicht mehr kapput machen. einige zeilenumbrüche müssen nachträglich entfernt werden (wo ein _ am ende ist).
Um ein überblick zu behalten welche spalten umgewandelt wurden (sollte das script abbrechen) wird eine Spalte benötigt mit dem namen konvertiert (Bit, default 0).

