sql server — символы Unicode становятся & quot; ?????????? & quot; на стороне PHP, но данные NVARCHAR и SELECT показывает правильные данные

У меня есть база данных с параметрами сортировки 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);

Есть ли у вас решение для всех трех ситуаций?

0

Решение

Решение:

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

  • закодируйте ваши 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);
}
...
?>

Пример:

<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 колонка.

1

Другие решения

Вероятные причины:

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector