凡愚なので、すらすらとは解けないわけです。
というかビットがどうのなんて普段触らないので
いまいちピンとこなかったわけですが、
なんとなしに packかなーとおもってやってみたらできた。
(これは10分でわかった!)
echo mb_strlen(pack('H*','e4bba5e4b88be381aee69687e5ad97e58897e381af5554462d38e38292e69687e5ad97e382a8e383b3e382b3e383bce38387e382a3e383b3e382b0e5bda2e5bc8fe381a8e38199e3828b3136e980b2e695b0e381aee38390e382a4e38388e58897e381a7e38182e3828be38082'),'UTF-8'); //41
他にもやり方あるかなーとおもって
勉強ついでに手でpackしてみる
(こっから1時間コース orz)
$odai = "e4bba5e4b88be381aee69687e5ad97e58897e381af5554462d38e38292e69687e5ad97e382a8e383b3e382b3e383bce38387e382a3e383b3e382b0e5bda2e5bc8fe381a8e38199e3828b3136e980b2e695b0e381aee38390e382a4e38388e58897e381a7e38182e3828be38082"; //これで16進数文字を2進数に直して for ($i=0;$i<strlen($odai);$i++) $dec .= str_pad(base_convert($odai[$i],16,2),4,0,STR_PAD_LEFT); //正規表現でとってみる print(preg_match_all("/(0[0-1]{7})|(110[0-1]{13})|(1110[0-1]{20})/u",$dec,$match)); //41 //真面目にループしてみる $strCount = 0; for ($i=0;$i<strlen($dec);$i+=8) { if (substr($dec,$i,1) === '0') { $strCount += 1; } else if (substr($dec,$i,3) === '110') { $strCount += 1; $i +=8; } else if (substr($dec,$i,4) === '1110') { $strCount += 1; $i +=16; } } print($strCount); //41
意外とできるもんだ~
さて天下一プログラマーはどんな答えになるんだろう?
—
ぐぐって偉い人の答えを見てると
だいたい [89ab]. で直で正規表現でとってるようで。
UTF8の仕組みがよくわかってないとだめだなぁ。