У нас возникли проблемы с разработкой нашего 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).
В любом случае, проблема возникает с акцентированными символами. Чтобы правильно вывести их на наших машинах для разработки, работающих под управлением Windows, мы должны сделать следующее.
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 пересекаются, по крайней мере, в том, что касается букв и цифр (я не проверял ВСЕ возможные символы, заметьте, поэтому я уверен, что где-то две кодировки будут отличаются).