Нужна помощь в устранении несоответствия кодировки Vertica ODBC Windows VS Linux

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


person Osuwariboy    schedule 09.02.2015    source источник


Ответы (1)


В Windows вам нужно работать с UTF-16 (или UCS-2), а не с UTF-8. Я не уверен, но я думаю, что в Windows это UTF-16 с BOM (зависит от версии MS Windows и конфигурации системы)

О региональных настройках

Ожидается, что все входные данные, полученные сервером базы данных, будут в формате UTF-8, а все выходные данные HP Vertica — в кодировке UTF-8. API ODBC работает с данными в UCS-2 в системах Windows и, как правило, в UTF-8 в системах Linux.

person Community    schedule 10.02.2015