こんにちは、名前を Oracle データベースに保存し、PHP と oci8 を使用してそれらを取得しようとしています。
ただし、é
Oracle データベースに直接挿入し、oci8 を使用してそれを取得すると、e
データベースに挿入する前に、すべての特殊文字 ( を含むé
) を html エンティティ (つまり: ) にエンコードする必要がありますか? それとも何か不足していますか?é
どうも
更新: 3 月 1 日 18:40
この関数を見つけました: http://www.php.net/manual/en/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;
}
うまくいくようですが、最適な解決策かどうかはわかりません
更新: 3 月 8 日 15:45
Oracle の文字セットは ISO-8859-1 です。
PHPで追加しました:
putenv("NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1");
oci8 接続でその文字セットを使用するように強制します。é
PHP からの using oci8 の取得が機能するようになりました! (のために、しかしそれを抽出する必要はありませんでした)それでvarchars
、
PHPからOracleにデータを保存しようとしました...そしてそれはうまくいきません..PHPからOracleへの途中のどこかでCLOBs
utf8_encode
é
?
更新: 3 月 9 日 14:47
だから近づいて。NLS_LANG 変数を追加した後、直接 oci8 挿入を行うとé
動作します。
問題は実際には PHP 側にあります。ExtJs フレームワークを使用することで、フォームを送信するときに .xml を使用してエンコードしencodeURIComponent
ます。
Soé
は として送信され%C3%A9
、 に再エンコードされé
ます。
ただし、長さは1 ではなく2 (strlen($my_sent_value) = 2)
になりました。PHP で試してみると、次のようになります。 $my_sent_value == é
= FALSE
これらすべての文字をPHPで再エンコードしてバイトサイズ1の長さに戻し、それらをOracleに挿入できれば、うまくいくはずです。
それでも運が悪い
更新: 3 月 10 日 11:05
私は自分がとても近くにいると思っています(それでも遠く離れています)。
putenv("NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P9");
非常に散発的に動作します。
テストする小さな php スクリプトを作成しました。
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);
これを一度実行して Oracle データベースに直接ログインすると、STRING_FIELD が に設定されていることがわかります|¿|
。明らかに、以前の経験から期待していたものではありませんでした。
ただし、その PHP ページをすばやく 2 回更新すると、うまくいきました !!!
Oracleでは、正しく見ました|é|
。
環境変数が正しく設定されていないか、スクリプトの最初の実行に間に合うように送信されていないようですが、2 回目の実行では使用できます。
私の次の実験は、変数を PHP の環境にエクスポートすることですが、そのためには Apache をリセットする必要があります。