Имея дело с 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 é становится a ?


ОБНОВЛЕНИЕ: 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 для этого..., таким образом, мы будем видеть то, что происходит, надо надеяться, это работает.

5
задан 9 revs 10 March 2010 в 21:33
поделиться

3 ответа

Это то, что я в конечном итоге сделал для решения этой проблемы :

Изменен профиль демона, работающего с PHP, чтобы иметь:

NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1

Чтобы соединение oci8 использовало ISO-8859-1.

Затем в моей конфигурации PHP установите тип содержимого по умолчанию на ISO-8859-1:

default_charset = "iso-8859-1"

Когда я вставляю в таблицу Oracle через oci8 из PHP, я делаю:

utf8_decode($my_sent_value)

И при получении данных от Oracle, печать переменной должна работать так:

echo $my_received_value

Однако при отправке этих данных через ajax мне пришлось использовать:

utf8_encode($my_received_value)
2
ответ дан 15 December 2019 в 00:59
поделиться

Полагаю, вам известны следующие факты:

  • Существует множество различных наборов символов: вы должны выбрать один и, конечно, знать, какой из них вы используете.
  • Oracle вполне способен хранить текст без HTML-сущностей (é). HTML-сущности используются в, ну, в HTML. Oracle - это не веб-браузер ;-)

Вы также должны знать, что сущности HTML не привязаны к определенной кодовой таблице; наоборот, они используются для представления символов в независимом от кодовой таблицы контексте.

Вы неразборчиво говорите о ISO-8859-1 и UTF-8. Какую кодовую таблицу вы хотите использовать? ISO-8859-1 проста в использовании, но она может хранить текст только на некоторых латинских языках (например, испанском), и в ней отсутствуют некоторые распространенные символы, например, символ €. UTF-8 сложнее в использовании, но он может хранить все символы, определенные консорциумом Unicode (которые включают все, что вам когда-либо понадобится).

Приняв решение, вы должны настроить Oracle для хранения данных в такой кодовой таблице и выбрать соответствующий тип столбца. Например, VARCHAR2 подходит для обычного ASCII, NVARCHAR2 - для UTF-8.

2
ответ дан 15 December 2019 в 00:59
поделиться

Если вы действительно не можете изменить набор символов, который будет использовать oracle, то как насчет Base64 кодирования ваших данных перед сохранением их в базе данных. Таким образом, вы сможете принимать символы из любого набора символов и хранить их как ISO-8859-1 (поскольку Base64 выводит подмножество набора символов ASCII, которое точно соответствует ISO-8859-1). Кодирование Base64 увеличит длину строки в среднем на 37%

Если ваши данные будут отображаться только в формате HTML, то вы можете хранить HTML-сущности, как вы предложили, но имейте в виду, что одна сущность может содержать до 10 символов на один некодированный символ, например, ϑ - ϑ

0
ответ дан 15 December 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: