У нас возникли некоторые проблемы при разработке нашего PHP-приложения с использованием Vertica. Поскольку изображение стоит тысячи слов, скажем, у нас есть текущий код:
if(PHP_OS == "Linux")
$c = new PDOVertica("Driver=/opt/vertica/lib64/libverticaodbc.so;Server=192.168.1.49;Port=5433;Database=flexgroup;", "user", "password");
else
$c = new PDOVertica("Driver=Vertica;Server=192.168.1.49;Port=5433;Database=flexgroup;Server_CSet=UTF-8", "user", "password");
$sql = "SELECT NoClient, NomClient FROM tblclients ORDER BY NomClient";
$stmt = $c -> prepare( $sql );
$stmt -> execute();
while($res = $stmt -> fetch(PDO::FETCH_ASSOC))
{
echo $res['NomClient'];
}
Этот простой фрагмент кода работает и выводит имена наших клиентов почти правильно (если кому-то интересно, класс PDOVertica — это самодельная оболочка, которую мы создали, чтобы обойти ошибку, когда PDO теряет значения параметров. Он вызывает соответствующие функции ODBC).
В любом случае, проблема заключается в акцентированных символах. Чтобы правильно выводить их на наши машины для разработки, на которых запущены окна, мы должны сделать следующее
echo utf8_encode($res['NomClient']);
Теперь это не будет проблемой, если и среда производства, и среда разработки будут работать одинаково … но, конечно, это не так. В производстве использование utf8_encode искажает строку, и вместо этого мы должны сделать это для того, чтобы та же строка выглядела правильно:
echo $res['NomClient'];
Тогда вопрос очень прост: кому-нибудь когда-нибудь удавалось решить это несоответствие кодировки?
Заранее спасибо,
Осу
РЕДАКТИРОВАТЬ: В ответ на sKwa, я действительно знал о UTF-16 / UCS-2 вещь до публикации. Однако я допустил ошибку, предполагая, что UTF-8 и UTF-16 действительно совместимы … они не совместимы. Другая ошибка, которую я сделал, была, когда я изменил кодировку своей страницы на ISO-8859-1 и был удивлен, увидев, что все волшебным образом отображается правильно. Причина этого заключается в том, что ISO-8859-1 и UTF-16 пересекаются, по крайней мере, в отношении букв и цифр (я не проверял КАЖДЫЙ возможный символ, заметьте, поэтому я уверен, что где-то два кодирования будут отличается).
В Windows вам нужно работать с UTF-16 (или UCS-2), а не с UTF-8. Я не уверен, но я думаю, что на Windows его UTF-16 с BOM(зависит от версии MS Windows и конфигурации системы)
Ожидается, что все входные данные, полученные сервером базы данных, будут в формате UTF-8, а все данные, выводимые HP Vertica, находятся в формате UTF-8. ODBC API работает с данными в UCS-2 в системах Windows и, как правило, в UTF-8 в системах Linux.
Других решений пока нет …