Работа с eacute и другими специальными символами с использованием Oracle, PHP и Oci8
Привет, я пытаюсь сохранить имена в базе данных Oracle и получить их обратно, используя PHP и oci8.
Однако, если я вставлюé
непосредственно в базу данных Oracle и использовать oci8, чтобы получить его обратно, я просто получаюe
Нужно ли кодировать все специальные символы (включаяé
) в HTML-сущности (то есть:é
) перед вставкой в базу данных ... или я что-то упустил?
Спасибо
ОБНОВЛЕНИЕ: 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;
}
кажется, работает, хотя не уверен, что это оптимальное решение
ОБНОВЛЕНИЕ: 8 марта в 15:45
Набор символов Oracle - ISO-8859-1.
в PHP я добавил:
putenv("NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1");
заставить соединение oci8 использовать этот набор символов. Получениеé
Использование oci8 из PHP теперь работает! (заvarchars
, но нетCLOBs
Должен сделатьutf8_encode
извлечь его)
Затем я попытался сохранить данные из PHP в Oracle ... и это не сработало ... где-то на пути от PHP к Oracleé
становится?
ОБНОВЛЕНИЕ: 9 марта в 14:47
Итак, все ближе. После добавления переменной NLS_LANG выполните прямые вставки oci8 сé
работает.
Проблема на самом деле на стороне PHP. Используя среду ExtJs, при отправке формы она кодирует ее, используяencodeURIComponent
.
Такé
отправлено как%C3%A9
а затем перекодировать вé
.
Однако его длина сейчас2 (strlen($my_sent_value) = 2)
а не 1. А если в PHP я попробую: $ my_sent_value ==é
= ЛОЖНЫЙ
Я думаю, что если мне удастся перекодировать все эти символы в PHP обратно в длину размером 1 байт, а затем вставить их в Oracle, это должно сработать.
Все же не повезло, хотя
ОБНОВЛЕНИЕ: 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 дважды быстро, это сработает !!!
В Oracle я правильно увидел|é|
.
Кажется, что, возможно, переменная среды неправильно установлена или отправлена вовремя для первого выполнения сценария, но доступна для второго выполнения.
Мой следующий эксперимент - экспортировать переменную в среду PHP, однако для этого мне нужно сбросить Apache ... так что посмотрим, что произойдет, надеюсь, это сработает.