Oracle oci_connect AL32UTF8 php utf8 奇怪的字符
Oracle oci_connect AL32UTF8 php utf8 weird characters
我已经摸不着头脑了一段时间,我希望有人能把我推向正确的方向。
我有一个 Oracle 数据库,其中包含姓名、姓氏等帐户信息,如果我 运行 以下(伪)代码:
<?php
$db = "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=myHost)(PORT=myPort)))(CONNECT_DATA=(SERVICE_NAME=myServiceName)))";
oci_connect("user","pass",$db,'AL32UTF8');
$query="
SELECT
//tried this
lastname AS LAST_NAME
//tried this:
(convert(lastname,'AL32UTF8')) AS LAST_NAME
FROM
SomeDb
WHERE
SomeId = 1234
";
$stid = oci_parse($c1, $query);
oci_execute($stid);
$row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS);
echo $row['LAST_NAME']; //returns �¼
echo utf8_decode($row['LAST_NAME']); // returns ür
echo utf8_encode($row['LAST_NAME']); // returns ���¼
它 returns ü
个字符返回为:Ã�¼
,而 ë
个字符正在正确显示。
我检查了 Oracle 服务器的 NLS_CHARACTERSET
设置为:AL32UTF8
。
我还检查了 Apache 字符集配置:
curl -A "Mozilla/4.0" http://localhost -I
HTTP/1.1 200 OK
Date: Tue, 05 Sep 2017 13:08:01 GMT
Server: Apache/2.4.10 (Debian)
Content-Type: text/html; charset=UTF-8
我试过设置内码:
mb_internal_encoding("UTF-8"); // this seemed to be default UTF-8.
我尝试了几个 setenv
值,但似乎没有任何效果。可能是什么问题呢?我是不是忽略了什么?
附加信息:
PHP -v
PHP 5.6.30-0+deb8u1
OCI8
OCI8 Version 2.0.8
此外;我尝试了以下代码来找到正确的编码,它总是给我 UTF-8
。如果我将 UTF-8
移到数组的后面,它总是给我 ISO-8859-1
。结果没用。
$encodings= array( 'UTF-8', 'ASCII', 'ISO-8859-1', 'ISO-8859-2', 'ISO-8859-3', 'ISO-8859-4', 'ISO-8859-5',
'ISO-8859-6', 'ISO-8859-7', 'ISO-8859-8', 'ISO-8859-9', 'ISO-8859-10',
'ISO-8859-13', 'ISO-8859-14', 'ISO-8859-15', 'ISO-8859-16',
'Windows-1251', 'Windows-1252', 'Windows-1254');
echo mb_detect_encoding($string, $encodings, true);
进一步研究没有找到原因或解决方案,所以我决定将 Oracle 数据库中的源字符调整为正确的字符。
我知道这不是我真正想要的解决方案,但由于显示这种奇怪翻译的字符数量非常少,所以这是最快的解决方案。
感谢所有和我一起思考的人。
此致,
弗兰斯
我已经摸不着头脑了一段时间,我希望有人能把我推向正确的方向。
我有一个 Oracle 数据库,其中包含姓名、姓氏等帐户信息,如果我 运行 以下(伪)代码:
<?php
$db = "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=myHost)(PORT=myPort)))(CONNECT_DATA=(SERVICE_NAME=myServiceName)))";
oci_connect("user","pass",$db,'AL32UTF8');
$query="
SELECT
//tried this
lastname AS LAST_NAME
//tried this:
(convert(lastname,'AL32UTF8')) AS LAST_NAME
FROM
SomeDb
WHERE
SomeId = 1234
";
$stid = oci_parse($c1, $query);
oci_execute($stid);
$row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS);
echo $row['LAST_NAME']; //returns �¼
echo utf8_decode($row['LAST_NAME']); // returns ür
echo utf8_encode($row['LAST_NAME']); // returns ���¼
它 returns ü
个字符返回为:Ã�¼
,而 ë
个字符正在正确显示。
我检查了 Oracle 服务器的 NLS_CHARACTERSET
设置为:AL32UTF8
。
我还检查了 Apache 字符集配置:
curl -A "Mozilla/4.0" http://localhost -I
HTTP/1.1 200 OK
Date: Tue, 05 Sep 2017 13:08:01 GMT
Server: Apache/2.4.10 (Debian)
Content-Type: text/html; charset=UTF-8
我试过设置内码:
mb_internal_encoding("UTF-8"); // this seemed to be default UTF-8.
我尝试了几个 setenv
值,但似乎没有任何效果。可能是什么问题呢?我是不是忽略了什么?
附加信息:
PHP -v
PHP 5.6.30-0+deb8u1
OCI8
OCI8 Version 2.0.8
此外;我尝试了以下代码来找到正确的编码,它总是给我 UTF-8
。如果我将 UTF-8
移到数组的后面,它总是给我 ISO-8859-1
。结果没用。
$encodings= array( 'UTF-8', 'ASCII', 'ISO-8859-1', 'ISO-8859-2', 'ISO-8859-3', 'ISO-8859-4', 'ISO-8859-5',
'ISO-8859-6', 'ISO-8859-7', 'ISO-8859-8', 'ISO-8859-9', 'ISO-8859-10',
'ISO-8859-13', 'ISO-8859-14', 'ISO-8859-15', 'ISO-8859-16',
'Windows-1251', 'Windows-1252', 'Windows-1254');
echo mb_detect_encoding($string, $encodings, true);
进一步研究没有找到原因或解决方案,所以我决定将 Oracle 数据库中的源字符调整为正确的字符。
我知道这不是我真正想要的解决方案,但由于显示这种奇怪翻译的字符数量非常少,所以这是最快的解决方案。
感谢所有和我一起思考的人。
此致,
弗兰斯