Ram*_*zan 4 php oracle apache2 oci8 character-encoding
已提出类似的问题,但常规解决方案对我不起作用。也许我错过了一些东西。我快要失去理智了:(((
\n\n从标题中你可以明白,我有一个oracle数据库,其中包含非ascii内容。我想使用oci8用php查询/显示它。
\n\n首先数据库是ISO8859P9,即查询
\n\nselect 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\nNLS_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”。
最后,我在 /etc/php5/apache2/php.ini 文件中有一行default_charset = "ISO-8859-9"
,在输出 phpinfo() 的核心部分中,我看到 default_charset 是 ISO-8859-9。
在完成所有这些内容之后,当我检索其中包含字符的字符串\xc4\xb0
并回显它时,它显示为 \'?\'。那就是问题所在!!!当我查询时select dump(nameofthatstring, 16)...
,我看到它的字节值为DD,即根据8859-9正确。
我不确定它是否相关,但是,我会给出最后的细节:当我\xc4\xb1
在表单中输入一个字符并通过ajax在GET中提交它时,它会转换为%FD,即8859-9对应的值,没问题。
当我对其进行 urldecode 并回显时,它再次正常,我明白了\xc4\xb1
。但是,当我有一个包含\xc4\xb1
在其 where 子句中的字符串的查询时(收到 ajax 请求后),它返回空集。
但是,如果我使用 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\noci_pconnect($username, $password, $database, "AMERICAN_AMERICA.WE8ISO8859P9");\n
Run Code Online (Sandbox Code Playgroud)\n\n但它没有解决,所以我设置了NLS_LANG变量并更改为以下内容:
\n\noci_pconnect($username, $password, $database);\n
Run Code Online (Sandbox Code Playgroud)\n\n没有改变...
\n尝试像这样连接:
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);
Run Code Online (Sandbox Code Playgroud)
$db*
根据您的配置设置变量。