2012-11-02 5 views
3

비슷한 질문이 있지만 정상적인 해결책이 적합하지 않습니다. 아마도 나는 뭔가를 놓치고 있습니다. 내가 내 마음을 풀어하려고 해요 :. (((당신은 제목에서 이해할 수 있듯이php-oci8 인코딩 문제

, 나는 비 ASCII 내용과 오라클 데이터베이스가 I 조회 할/를 사용 PHP로 표시 OCI8. 모든

먼저, 데이터베이스 쿼리, 즉 ISO8859P9에

select parameter, value from v$nls_parameters where parameter in ('NLS_CHARACTERSET', 'NLS_LANGUAGE', 'NLS_TERRITORY') 

반환

,938입니다

따라서 NLS_LANG 변수를 적절하게 설정 했으므로 getenv ("NLS_LANG")는 "AMERICAN_AMERICA.WE8ISO8859P9"를 반환합니다.

나는 /etc/apache2/conf.d/charset 파일에 AddDefaultCharset ISO-8859-9을 넣었고, 나는 항상 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-9">을 PHP 파일의 html 내용의 머리 부분에 포함 시켰습니다. 따라서 방화자를 통해 확인하면 응답의 "Content-Type"헤더가 "text/html; charset = ISO-8859-9"라는 것을 알 수 있습니다.

마지막으로 /etc/php5/apache2/php.ini 파일에 default_charset = "ISO-8859-9"이라는 줄이 있고 출력 phpinfo()의 핵심 섹션에서 default_charset이 ISO-8859-9임을 알 수 있습니다.

이 모든 것들을 수행 한 결과 문자 İ이있는 문자열을 검색하고 에코하면 '?'로 표시됩니다. 그게 문제 야!!! select dump(nameofthatstring, 16)...을 쿼리하면 해당 바이트 값이 DD, 즉 8859-9에 따라 올바르다는 것을 알 수 있습니다.

필자는 ı 문자를 양식에 입력하고 GET의 ajax를 통해 제출하면 % FD 즉 8859-9로 변환됩니다. 해당 값, 문제 없음.

내가 다시 코드화하고 에코하면 다시 확인하게됩니다. ı이 표시됩니다. 그러나 (where ajax 요청을받은 후) where 절에 ı을 포함하는 문자열이있는 쿼리를 사용하면 빈 세트가 반환됩니다.

그러나 CHR (253)을 사용하여 행을 선택하면 행이 올바르게 선택되지만 행을 다시 인쇄하면 '?' 문자.

정말 붙어 있습니다. 어떤 도움을 주시면 감사하겠습니다. 미리 감사드립니다.

편집 :

$database = "(DESCRIPTION= (ADDRESS= (PROTOCOL=TCP)(HOST=XXXX)(PORT=1521)) (CONNECT_DATA= (SERVER=dedicated)(SERVICE_NAME=sname)))"; 

첫째,이 시도 :

oci_pconnect($username, $password, $database, "AMERICAN_AMERICA.WE8ISO8859P9"); 

을하지만 해결되지 않았다, 그래서 나는 NLS_LANG 변수를 설정하고 다음과 같이 변경 :

oci_pconnect($username, $password, $database); 

변경 사항 없음 ...이 같은 연결

+0

php에서 oracle에 연결할 코드를 게시 할 수 있습니까? – Nelson

답변

3

시도 :

putenv("NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P9"); 
$db = "(DESCRIPTION= 
    (ADDRESS_LIST= 
     (ADDRESS=(PROTOCOL=TCP) 
     (HOST=$dbhost)(PORT=$dbport) 
     ) 
    ) 
     (CONNECT_DATA=(SID=$dbname)) 
)"; 
$conn = OCILogon($dbuser, $dbpasswd, $db); 

구성에 따라 변수를 $db* 설정합니다.

+0

OCILogon은 [deprecated] (http://php.net/manual/en/function.ocilogon.php)이며, 영구 연결을 선호하므로 oci_pconnect를 변경하지 않았습니다. 그러나 putenv는 트릭을했습니다 :). 그러나 어떻게? getenv ('NLS_LANG')는 이미 동일한 값을 반환했으며 phpinfo() 페이지에도 나열되었습니다. 좀 이상하지 않니? – Ramazan

+1

예, 이상하지만, 비슷한 문제 (스페인어 문자 세트 사용)가 있었고이 방법으로 해결했습니다. 그때 oci_logon()을 사용 했으므로 이제는 더 이상 사용되지 않습니다. – Nelson

+0

당신 구원자! 나는 너의 모든 부분에 키스하고 싶다 !! – crab

1

나는 당신이 Windows 환경에 있다고 가정합니다.

나는 같은 문제를했고 나는
* FRENCH_FRANCE.WE8ISO8859P1

내 httpd.conf를
적인 SetEnv NLS_LANG에 다음 줄을 추가


NLS_LANG FRENCH_FRANCE.WE8ISO8859P1 변수 윈도우 환경을 조성 *
하여 고정 NB : 적절한 값으로 FRENCH_FRANCE.WE8ISO8859P1을 대체하십시오.

+0

저는 Windows 환경에 없었습니다. 그런데 프로젝트가 죽었습니다. :) – Ramazan