У меня есть база данных с параметрами сортировки 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
:
- Строки, такие как английские символы или цифры:
xyz 32 -
- Строки, похожие на персидские символы:
مریم دختر خوبی است
- Строки, как указано выше:
مریم دختر خوبی است - Maryam is a good girl.
Что происходит, то в 1 и 2 код преобразует его успешно. Однако число 3 возвращает ошибку, когда оно пытается преобразовать его с iconv
, и выдает ошибку ниже:
iconv (): обнаружен неполный многобайтовый символ во входной строке
В этой строке:
$string = iconv('UCS-2LE', 'UTF-8', $str);
У вас есть какое-нибудь решение для всех 3 ситуаций?