php-oci8编码问题

Ram*_*zan 4 php oracle apache2 oci8 character-encoding

已提出类似的问题,但常规解决方案对我不起作用。也许我错过了一些东西。我快要失去理智了:(((

\n\n

从标题中你可以明白,我有一个oracle数据库,其中包含非ascii内容。我想使用oci8用php查询/显示它。

\n\n

首先数据库是ISO8859P9,即查询

\n\n
select parameter, value from v$nls_parameters where parameter in (\'NLS_CHARACTERSET\', \'NLS_LANGUAGE\', \'NLS_TERRITORY\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

回报

\n\n
NLS_LANGUAGE        AMERICAN\nNLS_TERRITORY       AMERICA\nNLS_CHARACTERSER    WE8ISO8859P9\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以我相应地设置了 NLS_LANG 变量,即 getenv("NLS_LANG") 返回“AMERICAN_AMERICA.WE8ISO8859P9”。

\n\n

我插入AddDefaultCharset ISO-8859-9到 /etc/apache2/conf.d/charset 文件,并且我总是包含<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-9">在 php 文件的 html 内容的 head 部分中。因此,当我通过 firebug 检查时,我看到响应的“Content-Type”标头是“text/html; charset=ISO-8859-9”。

\n\n

最后,我在 /etc/php5/apache2/php.ini 文件中有一行default_charset = "ISO-8859-9",在输出 phpinfo() 的核心部分中,我看到 default_charset 是 ISO-8859-9。

\n\n

在完成所有这些内容之后,当我检索其中包含字符的字符串\xc4\xb0并回显它时,它显示为 \'?\'。那就是问题所在!!!当我查询时select dump(nameofthatstring, 16)...,我看到它的字节值为DD,即根据8859-9正确。

\n\n

我不确定它是否相关,但是,我会给出最后的细节:当我\xc4\xb1在表单中输入一个字符并通过ajax在GET中提交它时,它会转换为%FD,即8859-9对应的值,没问题。

\n\n

当我对其进行 urldecode 并回显时,它再次正常,我明白了\xc4\xb1。但是,当我有一个包含\xc4\xb1在其 where 子句中的字符串的查询时(收到 ajax 请求后),它返回空集。

\n\n

但是,如果我使用 CHR(253) 选择行,则会正确选择行,但再次打印这些行会产生 \'?\' 字符。

\n\n

我真的被困住了。任何帮助将不胜感激。\n提前致谢。

\n\n

编辑:

\n\n
$database = "(DESCRIPTION= (ADDRESS= (PROTOCOL=TCP)(HOST=XXXX)(PORT=1521)) (CONNECT_DATA= (SERVER=dedicated)(SERVICE_NAME=sname)))";\n
Run Code Online (Sandbox Code Playgroud)\n\n

首先,我尝试过这个:

\n\n
oci_pconnect($username, $password, $database, "AMERICAN_AMERICA.WE8ISO8859P9");\n
Run Code Online (Sandbox Code Playgroud)\n\n

但它没有解决,所以我设置了NLS_LANG变量并更改为以下内容:

\n\n
oci_pconnect($username, $password, $database);\n
Run Code Online (Sandbox Code Playgroud)\n\n

没有改变...

\n