Lidando com eacute e outros caracteres especiais usando Oracle, PHP e Oci8

Oi, eu estou tentando armazenar nomes em um banco de dados Oracle e buscá-los de volta usando PHP e oci8.

No entanto, se eu inserir oé diretamente no banco de dados Oracle e use o oci8 para buscá-lo de volta. Acabei de receber ume

Preciso codificar todos os caracteres especiais (incluindoé) em entidades html (ou seja:é) antes de inserir no banco de dados ... ou estou faltando alguma coisa?

Valeu

ATUALIZAÇÃO: 01/03 às 18:40

encontrou esta função: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;
}

parece funcionar, embora não tenha certeza se é a solução ideal

ATUALIZAÇÃO: 8/03 às 15:45

O conjunto de caracteres da Oracle é ISO-8859-1.
em PHP eu adicionei:

putenv("NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1");

para forçar a conexão oci8 a usar esse conjunto de caracteres. Recuperando oé usando oci8 do PHP agora funcionou! (paravarchars, mas nãoCLOBs tive que fazerutf8_encode extrair)
Então, eu tentei salvar os dados do PHP para Oracle ... e ele não funciona .. em algum lugar ao longo do caminho do PHP para Oracle oé torna-se um?

ATUALIZAÇÃO: 9/03 às 14:47

Então, chegando mais perto. Após adicionar a variável NLS_LANG, a inserção direta de oci8 comé trabalho.

O problema está realmente no lado do PHP. Ao usar a estrutura ExtJs, ao enviar um formulário, ele o codifica usandoencodeURIComponent.
assimé é enviado como%C3%A9 e depois recodificadoé.
No entanto, é comprimento é agora2 (strlen($my_sent_value) = 2) e não 1. E se em PHP eu tentar: $ my_sent_value ==é = FALSO

Eu acho que se eu conseguir recodificar todos esses caracteres no PHP de volta para comprimentos de tamanho de byte 1 e depois inseri-los no Oracle, deve funcionar.

Ainda sem sorte

ATUALIZAÇÃO: 10/03 às 11:05

Eu continuo pensando que estou tão perto (mas tão longe).

putenv("NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P9"); funciona muito esporadicamente.

Eu criei um pequeno script php para testar:

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);

Depois de executar isso uma vez e fazer login diretamente no banco de dados Oracle, vejo que STRING_FIELD está definido como|¿|. Obviamente não era o que eu esperava da minha experiência anterior.
No entanto, se eu atualizar essa página PHP duas vezes rapidamente .... funcionou !!!
No Oracle eu vi corretamente|é|.

Parece que talvez a variável de ambiente não esteja sendo definida ou enviada corretamente a tempo da primeira execução do script, mas esteja disponível para a segunda execução.

Meu próximo experimento é exportar a variável para o ambiente do PHP, no entanto, preciso redefinir o Apache para isso ... então vamos ver o que acontece, espero que funcione.

questionAnswers(4)

yourAnswerToTheQuestion