Umgang mit eacute und anderen Sonderzeichen mit Oracle, PHP und Oci8
Hallo, ich versuche, Namen in einer Oracle-Datenbank zu speichern und sie mit PHP und oci8 wieder abzurufen.
Wenn ich jedoch dieé
direkt in die Oracle-Datenbank und benutze oci8, um es wieder abzurufen. Ich erhalte gerade einee
Muss ich alle Sonderzeichen (einschließliché
) in HTML-Entitäten (dh:é
) vor dem Einfügen in die Datenbank ... oder fehlt mir etwas?
Vielen Dank
UPDATE: 1. März um 18:40 Uhr
fand diese Funktion:http://www.php.net/manual/de/function.utf8-decode.php#85034
function charset_decode_utf_8($string) {
if(@!ereg("[\200-\237]",$string) && @!ereg("[\241-\377]",$string)) {
return $string;
}
$string = preg_replace("/([\340-\357])([\200-\277])([\200-\277])/e","'&#'.((ord('\\1')-224)*4096 + (ord('\\2')-128)*64 + (ord('\\3')-128)).';'",$string);
$string = preg_replace("/([\300-\337])([\200-\277])/e","'&#'.((ord('\\1')-192)*64+(ord('\\2')-128)).';'",$string);
return $string;
}
scheint zu funktionieren, obwohl nicht sicher, ob es die optimale Lösung ist
UPDATE: 8. März um 15:45 Uhr
Der Zeichensatz von Oracle ist ISO-8859-1.
in PHP habe ich hinzugefügt:
putenv("NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1");
um die oci8-Verbindung zu zwingen, diesen Zeichensatz zu verwenden. Abrufen deré
mit oci8 von PHP hat jetzt geklappt! (zumvarchars
, aber nichtCLOBs
musste tunutf8_encode
um es zu extrahieren)
Also habe ich versucht, die Daten von PHP nach Oracle zu speichern ... und es funktioniert nicht ... irgendwo auf dem Weg von PHP nach Oracleé
wird zu einer?
UPDATE: 9. März um 14:47 Uhr
Also näher kommen. Nachdem Sie die Variable NLS_LANG hinzugefügt haben, führen Sie direkte oci8-Einfügungen mit ausé
funktioniert.
Das Problem ist eigentlich auf der PHP-Seite. Wenn Sie das ExtJs-Framework verwenden, wird es beim Senden eines Formulars mithilfe von codiertencodeURIComponent
.
Damité
wird gesendet als%C3%A9
und dann neu codiert iné
.
Allerdings ist es jetzt Länge2 (strlen($my_sent_value) = 2)
und nicht 1. Und wenn ich in PHP versuche: $ my_sent_value ==é
= FALSCH
Ich denke, wenn ich in der Lage bin, alle diese Zeichen in PHP wieder in Längen von Byte Größe 1 zu kodieren und sie dann in Oracle einzufügen, sollte es funktionieren.
Trotzdem kein Glück
UPDATE: 10. März um 11:05 Uhr
Ich denke immer, ich bin so nah (und doch so weit weg).
putenv("NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P9");
arbeitet sehr sporadisch.
Ich habe ein kleines PHP-Skript zum Testen erstellt:
header('Content-Type: text/plain; charset=ISO-8859-1');
putenv("NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P9");
$conn= oci_connect("user", "pass", "DB");
$stmt = oci_parse($conn, "UPDATE temp_tb SET string_field = '|é|'");
oci_execute($stmt, OCI_COMMIT_ON_SUCCESS);
Nachdem ich dies einmal ausgeführt und mich direkt in die Oracle-Datenbank eingeloggt habe, sehe ich, dass STRING_FIELD auf gesetzt ist|¿|
. Offensichtlich nicht das, was ich von meinen bisherigen Erfahrungen erwartet hatte.
Allerdings, wenn ich diese PHP-Seite zweimal schnell aktualisiere ... es hat funktioniert !!!
In Oracle habe ich richtig gesehen|é|
.
Es scheint, als ob die Umgebungsvariable nicht richtig gesetzt oder rechtzeitig zur ersten Ausführung des Skripts gesendet wurde, aber für die zweite Ausführung verfügbar ist.
Mein nächstes Experiment besteht darin, die Variable in die PHP-Umgebung zu exportieren. Allerdings muss ich Apache dafür zurücksetzen ... also werden wir sehen, was passiert, hoffentlich funktioniert es.