前提
phpで文字数のカウントに取り組んでいます。
実現したいこと
grapheme_strlen
の実行に際して、マニュアル通りの結果を得たいです。
マニュアルはこちらです。
grapheme_strlen
https://www.php.net/manual/ja/function.grapheme-strlen.php
得たい結果はマニュアルの一番最後に載っているこちらです。
echo grapheme_strlen('🏴'); //1 - Bingo
発生している問題
該当のソースコードが上記マニュアルと異なる結果を返し、以下7
を得ます
該当のソースコード
php
1echo grapheme_strlen('🏴'); //7 - なぜ...?
試したこと
試したこと 1(コードの確認)
まずマニュアルのコピペミスを懸念し、改めてコピペしましたが変化なしでした。
これは「質問への追記・修正の依頼」で m.ts10806様 から改めて確認するようご指摘頂き、再三のコピペで確認致しました。
ちなみに3v4lにマニュアルをコピペするとこうなります。
https://3v4l.org/QXCFu
以上みなさんがされても同様だと思いますので、コピペミスは考えにくい思います。
試したこと 2(バージョンの確認)
次にphpバージョンを確認すると 8.0.16 で問題はなさそうでした。
php
1echo phpversion().PHP_EOL; //8.0.16
本当に 8.0.16 なのか?と疑い、「8.0ならエラーになる」という次のリンクのコードを試しました。
PHP 7.3では配列のオフセットの指定に波括弧を利用できましたが、PHP 8.0ではFatal Errorが発生します。
$hoge = [1, 2, 3];
echo $hoge{0};
https://recruit.gmo.jp/engineer/jisedai/blog/php8-version-up-notes/
しかし正しくFatal error
となりました。
log
1[17-Sep-2022 00:03:57 UTC] PHP Fatal error: Array and string offset access syntax with curly braces is no longer supported in /home/xxxxxxxxxxxx/example.com/public_html/wp-content/themes/test/header.php on line 22
試したこと 3(関数の有無を確認)
grapheme_strlen
の有無を確認しましたが以下問題なくtrue
でした。
php
1var_dump( function_exists('grapheme_strlen') ); //true
試したこと 4(バージョンの変更)
Xサーバーの管理画面で 8.0.16 を 8.1.6 にアップデートしたものの改善は見られませんでした。
逆に 7.4.28 にダウングレードしても同様でした。
試したこと 5(JavaScriptの停止)
まさか「画面上の1
を7
に置換する」というJavaScriptでも動いているのか?と思い、ブラウザでJavaScriptを停止しましたが、さすがにそんなスクリプトはなかったようです。
試したこと 6(コマンドで実行)
Teratermから以下コードをコピペし実行しました。'abc'
の方は普通に3
ですが、'🏴'
の方はペースト時に??????????????
になってしまい14
となり、どうやらコマンドでは絵文字は使えないようでした。
Teraterm
1php -r "echo grapheme_strlen('abc'),PHP_EOL;" //3 2php -r "echo grapheme_strlen('🏴'),PHP_EOL;" //14
試したこと 7(文字コード確認)
phpの実行で確認
次のコードを実行しましたが、UTF-8で問題ないように思われます。
php
1// デフォルトの判定可能な文字コード 2print_r(mb_detect_order()); 3 4// 文字コード確認 5$utf8s = ['テスト','🏴']; 6foreach( $utf8s as $utf8 ){ 7 echo $utf8 . ':' . mb_detect_encoding($utf8).PHP_EOL; 8} 9 10/* 11Array 12( 13 [0] => ASCII 14 [1] => JIS 15 [2] => UTF-8 16 [3] => EUC-JP 17 [4] => SJIS 18) 19テスト:UTF-8 20🏴:UTF-8 21*/
エディタで確認
尚、下図のようにエディタ(Notepad++)の文字コードも「UTF-8」でしたので、PHPファイル自体の文字コードも問題ないと思われます。
php.iniで確認
さらにXサーバーの管理画面からphp.iniを見てみましたが、default_charset = UTF-8
とmbstring.internal_encoding = UTF-8
で、これも問題なさそうです。
試したこと 8(他の Grapheme 関数)
Grapheme 関数が他にいくつかございましたので、以下を実行してみました。おそらく本来は同じ値になるはずですが、こちらもおかしかったです。
php
1echo bin2hex('🏴'); 2//f09f8fb4f3a081a7f3a081a2f3a081a5f3a081aef3a081a7f3a081bf 3echo bin2hex(grapheme_substr('🏴',0,1)); 4//f09f8fb4
試したこと 9(index.phpで実行)
WordPressを介さずpublic_html直下のindex.phpで実行しました。これもマニュアルをコピペした5行のみを記載しましたが、変化は見られませんでした。
補足情報(FW/ツールのバージョンなど)
尚、ご参考になるかわかりませんが、Xサーバーを利用しWordPress上で実行しブラウザで結果を確認しています。
原因、解決策、他に試すべき事柄などについて思い当たることがございましたら、ご回答宜しくお願い致します。