Разные варианты UTF-8 запятая?[,] [,] - Ответ CURL для данных MySQL - PullRequest
2 голосов
/ 07 марта 2019

Подготовка ответа 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 ...

Ответы [ 2 ]

1 голос
/ 07 марта 2019

Может потребоваться функция mb_convert_kana, которая может преобразовывать символы различной ширины в одинаковую ширину.

$s = 'This is a string with ,, (commas having different widths)';

echo 'original : ', $s, PHP_EOL;
echo 'converted: ', mb_convert_kana($s, 'a');

результат:

original : This is a string with ,, (commas having different widths)
converted: This is a string with ,, (commas having different widths)

Документация PHP: mb_convert_kana
Чтобы получить представление о том, что означает значение, см. Также http://unicode.org/reports/tr11-2/

По соглашению, символы шириной 1/2 Em в восточноазиатских кодировках наследия называются "полуширинами"(или символы hankaku на японском языке), остальные называются соответственно "полноразмерными" (или zenkaku) символами.

0 голосов
/ 08 марта 2019

При подходящем COLLATION две запятые рассматриваются как равные:

mysql> SELECT ',' = ',' COLLATE utf8mb4_general_ci;
+----------------------------------------+
| ',' = ',' COLLATE utf8mb4_general_ci  |
+----------------------------------------+
|                                      0 |
+----------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT ',' = ',' COLLATE utf8mb4_unicode_ci;
+----------------------------------------+
| ',' = ',' COLLATE utf8mb4_unicode_ci  |
+----------------------------------------+
|                                      1 |
+----------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT ',' = ',' COLLATE utf8mb4_unicode_520_ci;
+--------------------------------------------+
| ',' = ',' COLLATE utf8mb4_unicode_520_ci  |
+--------------------------------------------+
|                                          1 |
+--------------------------------------------+
1 row in set (0.00 sec)

Было бы лучше поговорить в терминах HEX, а не Unicode:

mysql> SELECT HEX(','), HEX(',');
+------------+----------+
| HEX(',')  | HEX(',') |
+------------+----------+
| EFBC8C     | 2C       |
+------------+----------+
1 row in set (0.00 sec)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...