Oracle oci_connect AL32UTF8 php utf8奇怪的字符

时间:2017-09-05 13:35:48

标签: php oracle oci8

我一直在摸不着头脑,我希望有人能把我推向正确的方向。

我有一个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

1 个答案:

答案 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数据库中的源字符调整为正确的字符。

我知道它并不是我想要的解决方案,但由于显示这种奇怪翻译的字符数量非常低,这是最快的解决方案。

感谢所有与我一起思考的事情。

问候,

弗兰斯