Кодировка Apache + PHP(oci8) + Oracle XE

alhaos

Новичок
Кодировка Apache + PHP(oci8) + Oracle XE

Добрый.

У меня во такая хитрая связка. Все локально.

СУБД - Oracle Database 10g Express Edition Release 10.2.0.1.0

php - 5.3-win32-VC6-x86
ОС - Microsoft Windows [Версия 6.0.6002]
Веб - Apache 2.2

Учусь...

Делаю пример

PHP:
<?php

$conn = oci_connect('webuser', 'pass', 'XE', 'CL8MSWIN1251');
if (!$conn) {
    $e = oci_error();
    trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

// Prepare the statement
$stid = oci_parse($conn, 'select t.fcomment from t_comments t');
if (!$stid) {
    $e = oci_error($conn);
    trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}


$r = oci_execute($stid);
if (!$r) {
    $e = oci_error($stid);
    trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}


echo "<table border='1'>\n";
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
    echo "<tr>\n";
    foreach ($row as $item) {
        echo "    <td>" . ($item !== null ? htmlentities($item, ENT_QUOTES) : "_") . "</td>\n";
    }
    echo "</tr>\n";
}
echo "</table>\n";

oci_free_statement($stid);
oci_close($conn);

?>
Проблема с кодировкой, символы кириллицы выдает псевдографикой.

В базе используя internal_use поставил кодировку CL8MSWIN1251

SELECT PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'NLS_CHARACTERSET';

PROPERTY_VALUE
--------------------------------------------------------------------------------
CL8MSWIN1251

В реестре

HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_XE\NLS_LANG = AMERICAN_AMERICA.CL8MSWIN1251

В систему добавит переменную окружения:
NLS_LANG=AMERICAN_AMERICA.CL8MSWIN1251

В хеде документа прописал
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251">

Ради интереса пробовал выполнял запросы через PowerShell, делал импорт данных в Excel кодировка нормальная.

Ни пойму, откуда ноги...?

-~{}~ 08.01.10 19:24:

Нашел

htmlentities($item, ENT_QUOTES) : " ")

Какого то вот эта функция кодирует не так...

PHP:
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
foreach ($row as $item) {
echo $item;
}

}
Вместо

PHP:
echo "<table border='1'>\n";
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
echo "<tr>\n";
foreach ($row as $item) {
echo " <td>" . ($item !== null ? htmlentities($item, ENT_QUOTES) : " ") . "</td>\n";
}
echo "</tr>\n";
}
echo "</table>\n";
Работает на ура

-~{}~ 08.01.10 19:40:

точнее

htmlentities($item, ENT_QUOTES, 'cp1251')

нужно указать кодировку.
 
Сверху