为要插入到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 /数据库...
答案 0 :(得分:1)
您可能需要函数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)字符。
答案 1 :(得分:0)
使用合适的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)
最好用十六进制而不是unicode进行交谈:
mysql> SELECT HEX(','), HEX(',');
+------------+----------+
| HEX(',') | HEX(',') |
+------------+----------+
| EFBC8C | 2C |
+------------+----------+
1 row in set (0.00 sec)