我一直在摸不着头脑,我希望有人能把我推向正确的方向。
我有一个Oracle DB,其中包含Name,Surname等帐户信息,如果我运行以下(伪)代码:
<?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 ���¼
它会将ü
个字符返回为:Ã�¼
,而正确显示ë
个字符。
我已经检查了设置为NLS_CHARACTERSET
的Oracle服务器的AL32UTF8
。
我还检查了Apache charset config:
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
答案 0 :(得分:0)
另外;我尝试了以下代码来找到正确的编码,它始终给我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数据库中的源字符调整为正确的字符。
我知道它并不是我想要的解决方案,但由于显示这种奇怪翻译的字符数量非常低,这是最快的解决方案。
感谢所有与我一起思考的事情。
问候,
弗兰斯