Подготовка ответа Curl для конкретных данных, которые будут вставлены в таблицу MySQL.
Обратите внимание на некоторые специальные символы в сохраненных данных для определенных URL.
$curldata = curl_exec($curl);
$encoding = mb_detect_encoding($curldata);
вернул ASCII
кодировку.
Хорошо, не хочу этого.
Таблицы в моей базе данных имеют тип InnoDB
с сопоставлением utf8mb4_unicode_ci
.
Добавил это в мои параметры скручивания:
curl_setopt($curl, CURLOPT_ENCODING, 1);
И функция iconv
на основе вышеуказанной переменной mb_detect_encoding
/ $encoding
при сохранении.
$curldata = iconv($encoding, "UTF-8", $curldata);
// save to file to test output
file_put_contents('test.html', $curldata);
Не уверен, что это лучший способ для этого, но мой вывод test.html
больше не имеет никакой кодировки для специальных символов, поэтому ... (возможно) миссия выполнена.
Когда я анализирую данные, я замечаю этот символ.
Не обычная запятая ... [Сравнение:, / ,]
Но действует как один. Попробуйте сделать ctrl+f
и попробуйте найти запятую. Он рассматривает их как одинаковые и оба как символ UTF-8 - var_dump(mb_detect_encoding(','));
Я смотрю на строку в своей таблице и вижу ее как строку, вставленную как таковую
8,8
Если я пытаюсь найти ,
, он действительно возвращает случаи, когда присутствует ,
.
И наоборот, если я ищу ,
, он возвращает все случаи, когда это и запятая.
По сути, это запятая, но, очевидно, нет.
Это, конечно, выполнимо, но довольно раздражает и кажется изобилующим непоследовательностью.
Может кто-нибудь объяснить, почему две запятые одинаковы, но, очевидно, разные?
Есть ли решение для меня, чтобы эти странные символы не могли войти в мой ответ CURL или далее в мой ответ DOM
и PDO
Вставить.
редактирование:
Если актуально,
// dom
$dom = new DOMDocument('1.0', 'utf-8');
libxml_use_internal_errors(true);
$dom->preserveWhiteSpace = FALSE;
$dom->loadHTML(mb_convert_encoding($curldata, 'HTML-ENTITIES', 'UTF-8'));
// pdo
$pdoquery = "INSERT INTO `table` (`Attr`) VALUES (?)";
$value = "8,8";
$stmt = $pdo->prepare("INSERT INTO `table` (`Attr`) VALUES (?)");
$stmt->execute([$value]);
изменить 2:
Ну, похоже, это FULLWIDTH COMMA
..
var_dump(utf8_to_unicode(','));
строка "% uff0c" (длина = 6)
var_dump(utf8_to_unicode(','));
строка "% 2c" (длина = 3)
Начинаем придавать больше смысла ... теперь, чтобы выяснить, как предотвратить попадание таких символов в ответ curl / DOM / database ...