實現目標
輸入字串:”012\x99 走過的路,不要再走”,處理後,只保留漢字 “走過的路不要再走”
實現過程
1、從 utf-8 字元編碼轉化為 GB2312 多位元組編碼
2、GB2312漢字編碼範圍 [xb0-xf7][xa0-xfe],每兩個位元組形成一箇中文字元
3、使用 PHP 位元組操作函式 unpack 提取字元的二進位制
4、提取出中文字元
PHP 程式碼
/**
* 過濾出一句話中的中文字元
*
* @param string $sentence
* @return string
*/
public function filterGB2312Words($sentence)
{
$filterWords = '';
for ($i = 0, $iMax = mb_strlen($sentence); $i < $iMax; $i++) {
$wordUtf8 = mb_substr($sentence, $i, 1);
$wordGb2312 = iconv('utf-8', 'gb2312//IGNORE', $wordUtf8);
if (strlen($wordGb2312) < 2) {
// 不是中文, 跳過
continue;
}
$byte1 = unpack('C', $wordGb2312, 0)[1];
$byte2 = unpack('C', $wordGb2312, 1)[1];
// https://www.wenjiangs.com/group/topic-19158.html
// GB2312漢字: [xb0-xf7][xa0-xfe]
if (($byte1 >= ord("\xb0") && $byte1 <= ord("\xf7")) && ($byte2 >= ord("\xa0") && $byte2 <= ord("\xfe"))) {
$filterWords .= $wordUtf8;
}
}
return $filterWords;
}
/**
* 測試過濾中文字元,忽略半形或英文字元
*
* @return void
*/
public function testGB2312Words()
{
$sentence = "012\x99 走過的路,不要再走";
$result = $this->filterGB2312Words($sentence);
$this->assertEquals('走過的路不要再走', $result);
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結