Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > SQL Server Driver for PHP и юникод


Автор: href 5.8.2008, 16:12
 smile Пытаюсь заюзать  http://www.microsoft.com/downloads/details.aspx?FamilyId=61BF87E0-D031-466B-B09A-6597C21A2E2A&displaylang=en, чтобы решить проблему с выводов разных "хитрых" символов в юникоде. Вроде, всё как в примере, а вместо vojaĝo выводит иероглифы: 瘀漀樀愀ᴁ漀. Что не так?

Код

<?
define("_CHARSET","utf-8");

echo "<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset="._CHARSET."\">\n";

    $connectionInfo = array("UID" => $userName, "PWD" => $password, "Database"=>"avengo"); 
    $serverName = $hostName;    
    $conn = sqlsrv_connect($serverName, $connectionInfo);

    if( $conn ) {
        echo "Connection established.\n";
    } else {
            echo "Connection could not be established.\n";
            die( print_r( sqlsrv_errors(), true));
        }
    
    $reviewID = 4;
    $comments = utf8_encode("[Insert comment here.]");
    $comments = iconv("utf-8", "utf-16", $comments);

    $params1 = array(
                  array($comments,
                        null,
                        SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_BINARY)),
                  array($reviewID, null)
                );


    $tsql = "select FirstName from users where uniid='80FB0BC3-04CA-4CD1-B0D5-07FDD6A88742'";    
    $stmt2    =    sqlsrv_query($conn, $tsql, $params1);        
    
if( sqlsrv_fetch($stmt2) )
{
    echo "Comments: ";
    $data = sqlsrv_get_field($stmt2, 
                             0, 
                             SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_BINARY));
    $data = iconv("utf-16", "utf-8", $data);    
    echo $data."<br>";
}
else
{
     echo "Error in fetching data.<br>";
     die( print_r( sqlsrv_errors(), true));
}

    sqlsrv_free_stmt( $stmt2 );    
    sqlsrv_close($conn);
?>


Автор: href 5.8.2008, 17:20
вопрос, видимо, сводится к работе с iconv и тому, как из v�o�j�a�o� получить vojaĝo.

Автор: sTa1kEr 5.8.2008, 23:31
Никогда не использовал этот драйвер в PHP, но насколько я понимаю эту строчку
Цитата(href @  5.8.2008,  17:12 Найти цитируемый пост)
37:                             SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_BINARY));

Это говорит MSSQL-у получать данные в виде массива байт, т.е. в бинарном виде. Соответственно и конвертировать надо данные не из utf-8 в utf-16, а из byte в utf-8.

Автор: href 6.8.2008, 09:52
Так. Туплю: а каким образом я могу конвертировать из byte в utf-8? через iconv? 

Автор: sTa1kEr 7.8.2008, 08:20
Цитата(href @  6.8.2008,  10:52 Найти цитируемый пост)
Так. Туплю: а каким образом я могу конвертировать из byte в utf-8? через iconv?  

Я не внимательно посмотрел, похоже все правильно с iconv-ом, видимо надо разбиратся с сами драйвером.

Добавлено через 10 минут и 8 секунд
В крайнем случае, как вариант можно конвертировать данные в 8и битную кодировку на самом сервере и при получиении использовать SQLSRV_ENC_CHAR вместо SQLSRV_ENC_BINARY.

Автор: href 27.8.2008, 13:08
Решение проблемы подсказали на форуме по SQL Server Driver for PHP:
http://forums.microsoft.com/msdn/ShowPost.aspx?siteid=1&postid=3779431

Если вместо UTF-16 указывать UCS-2LE — всё работает  smile  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)