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.