Символы Юникода становятся "??????????"на стороне PHP, но данные NVARCHAR и SELECT показывает правильные данные - PullRequest
0 голосов
/ 15 сентября 2018

У меня есть база данных с параметрами сортировки SQL_Latin1_General_CP1_CI_AS, которые мне нужно преобразовать в параметры сортировки utf8_unicode_ci. Изменение таблицы не вариант. MSSQL возвращает такие данные:

[FirstName] => ??????????

но правдивые данные вот так:

[FirstName] => مریم

Я пробовал эти способы:

$utf8[] = utf8_encode($saleagent['FirstName']);
$utf8[] = iconv('ISO-8859-1', 'UTF-8',$saleagent['FirstName']);
$utf8[] = mb_convert_encoding($saleagent['FirstName'], 'UTF-8', 'ISO-8859-1');

вывод:

Array
(
    [0] => ??????????
    [1] => ??????????
    [2] => ??????????
)

Есть ли способ преобразовать существующие данные в utf8_unicode_ci?

Редактировать


Согласно этому ответу , я изменил свой код:

В SQL:

CAST(p.FirstName AS VARBINARY(MAX)) as FirstName,

В PHP я написал эту функцию для исправления кодировки:

public function fixEncoding($string)
{
    $original = $string;
    $string = trim($string);
    // Detect the input string encoding.
    $encoding = mb_detect_encoding($string, mb_detect_order(), false);

    if ($encoding == 'UTF-8' || $encoding == false) {
        $hex = bin2hex($string);

        $str = "";
        for ($i = 0; $i < strlen($hex) - 1; $i += 2) {
            $str .= chr(hexdec($hex[$i] . $hex[$i + 1]));
        }
        $string = iconv('UCS-2LE', 'UTF-8', $str);
        return $string;

    } elseif ($encoding == 'ASCII') {
        $string = $original;
        return $string;
    }

    return $string;
}

позвольте мне объяснить ситуацию. Я сталкиваюсь с 3 типами строк в базе данных mssql:

  1. Строки, такие как английские символы или цифры: xyz 32 -
  2. Строки, похожие на персидские символы: مریم دختر خوبی است
  3. Строки, как указано выше: مریم دختر خوبی است - Maryam is a good girl.

Что происходит, то в 1 и 2 код преобразует его успешно. Однако число 3 возвращает ошибку, когда оно пытается преобразовать его с iconv, и выдает ошибку ниже:

iconv (): обнаружен неполный многобайтовый символ во входной строке

В этой строке:

$string = iconv('UCS-2LE', 'UTF-8', $str);

У вас есть какое-нибудь решение для всех 3 ситуаций?

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Возможные причины:

  • Таблица / столбец не были объявлены как UTF-8
  • Байты в клиенте не были закодированы UTF-8
0 голосов
/ 17 сентября 2018

Решение:

Вы можете попробовать это:

  • кодируйте ваши html и php файлы в UTF-8 (я обычно использую Notepad ++ для этого шага).
  • выберите значения из MS SQL Server с помощью CONVERT(varbinary(max), UNICODECOLUMN);
  • преобразовать значения в части PHP с помощью $value = iconv('UTF-16LE', 'UTF-8', $unicodetext);

Вы можете изменить свою функцию на:

<?php
...
public function fixEncoding($string) {
    return iconv('UTF-16LE', 'UTF-8', $string);
}
...
?>

Пример: * ** 1022 тысячу двадцать одна * <html> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge"/> <meta charset="utf-8"> </head> <body> <?php # Connection $server = "server\instance,port"; $user = "user"; $password = "password"; $database = "database"; $cinfo = array( "Database" => $database, "UID" => $user, "PWD" => $password ); $conn = sqlsrv_connect($server, $cinfo); if ($conn === false) { echo "Error (sqlsrv_connect): ".print_r(sqlsrv_errors(), true); exit; } # Statement $sql = " SELECT CONVERT(varbinary(max), [NVARCHARTEXT]) AS [NVARCHARTEXT] FROM [dbo].UnicodeText "; $stmt = sqlsrv_query($conn, $sql); if ($stmt === false) { echo "Error (sqlsrv_prepare): ".print_r(sqlsrv_errors(), true); exit; } while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { $value = $row["NVARCHARTEXT"]; $value = iconv('UTF-16LE', 'UTF-8', $value); echo $value.'</br>'; } # End sqlsrv_free_stmt($stmt); sqlsrv_close($conn); ?> </body> </html> Примечания:

Примеры использования Драйвер PHP для SQL Server , SQL Server 2012, таблица со столбцом nvarchar.

...