为要插入 MySQL 表的特定数据准备 Curl 响应。
注意到某些 URL 的保存数据中有一些特殊字符。
$curldata = curl_exec($curl);
$encoding = mb_detect_encoding($curldata);
带回了ASCII
编码。
好吧,不要这样。
我数据库中的表是 InnoDB
类型,带有 utf8mb4_unicode_ci
排序规则。
将此添加到我的 curl 选项中:
curl_setopt($curl, CURLOPT_ENCODING, 1);
以及基于上述 mb_detect_encoding
/$encoding
变量的 iconv
函数。
$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(','));
string '%uff0c' (length=6)
var_dump(utf8_to_unicode(','));
string '%2c' (length=3)
开始变得更有意义了……现在要弄清楚如何防止这些字符进入 curl 响应/DOM/数据库……
最佳答案
您可能需要函数 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/
By convention, 1/2 Em wide characters of East Asian legacy encodings are called "half-width" (or hankaku characters in Japanese), the others are called correspondingly "full-width" (or zenkaku) characters.
关于php - UTF-8逗号的不同变体? [,] [,] - MySQL 数据的 CURL 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55035675/