ホームページ > バックエンド開発 > PHPチュートリアル > php_PHP チュートリアルで utf8 文字列の文字長を取得する例

php_PHP チュートリアルで utf8 文字列の文字長を取得する例

WBOY
リリース: 2016-07-13 10:40:05
オリジナル
947 人が閲覧しました

今夜、フレームワークのフォーム検証クラスを書いているときに、特定の文字列の長さが指定された範囲内にあるかどうかを判断する必要がありました。当然、PHP の strlen 関数を思い出しました。

コードは次のとおりです


$str = 'Hello world!中';
echo strlen($str); // 出力 12

あなたの中国語をテストしてください

コードは次のとおりです

$str = 'こんにちは、世界! ';
echo strlen($str); // GBK または GB2312 では出力 12、UTF-8 では出力 18

PHP の組み込みの文字列長関数 strlen は、中国語の文字列を正しく処理できません。文字列が占有するバイト数のみを取得します。 GB2312 の中国語エンコードの場合、strlen によって取得される値は中国語の文字数の 2 倍ですが、UTF-8 エンコードされた中国語の場合、その差は 3 倍になります (UTF-8 エンコードでは、1 つの中国語文字は 3 バイトを占有します)。

次の例は、有名な WordPress から引用したものですが、非常に正確です。また、この関数は utf-8 でエンコードされた文字列にのみ適用されることにも注意してください。

コードは次のとおりです


関数 utf8_strlen($string=null){
// 文字列をユニットに分解します
Preg_match_all("/./us", $string, $match);
// ユニット数を返します
戻り数($match[0]);
}

ただし、上記のコードはGBK/GB2312の中国語文字列をUTF-8エンコーディングで扱えないため、GBK/GB2312の中国語文字は2文字として認識され、計算される中国語文字数が2倍になるため、このようなことを考えました。方法:

コードは次のとおりです

$tmp = @iconv('gbk', 'utf-8', $str);
If(!empty($tmp)){
$str = $tmp;
}
Preg_match_all('/./us', $str, $match);
エコー数($match[0]);

GBK/GB2312およびUTF-8エンコーディングと互換性があります。少量のデータでテストされていますが、完全に正しいかどうかはまだ確認されていません

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/727579.html技術記事今夜フレームワークのフォーム検証クラスを作成していたとき、特定の文字列の長さが指定された範囲内にあるかどうかを判断する必要があったので、当然、PHP の strlen 関数を思い出しました。 コードは次のとおりです $str = 'こんにちは...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート