ホームページ  >  記事  >  バックエンド開発  >  PHPのord関数で漢字切り捨て問題が解決?

PHPのord関数で漢字切り捨て問題が解決?

WBOY
WBOYオリジナル
2016-06-23 13:44:321102ブラウズ

関数は次のように定義されます:

int ord ( string$string)

文字列 string の最初の文字の ASCII コード値を返します。

この関数は chr() の補完関数です。

試してみます:

echo ord('I');
これは 230 しか返せません。 ファイルを u8 で保存して出力したのは 230 だけで、16 進数に変換された 230 は e6 です。 utf-8 での私のエンコーディングは e68891 で、最初のバイトのみを取得します
echo chr(0xe6).chr(0x88).chr(0x91);

この例は utf-8 で使用できます 漢字「我」を出力します

文字エンコーディングについて知りたい場合は、ここをクリックしてください 文字エンコーディング

中国語の文字のgbk、utf-8、unicodeエンコーディング方法を確認したい場合は、Notepad++のHEXエディタを使用することをお勧めします。ここからダウンロードできます:

http://pan.baidu.com/s/1hquyJwo

こんな感じです


スキルを向上させましょう:

勤勉であることに加えて、プログラマーとして代名詞であると同時に、神秘性の象徴でもあります。たまにはセクシーなふりをするのもいいですね。エンコーディングについて話しているので、

utf-8 エンコーディングの世界では、誰もが自分に属する単語を見つけることができるわけではありません

「I」のエンコーディングは 3 つあります。バイトはそれぞれ e6、88、91 です。これにあなたの誕生日を入れたら、どんな言葉ができますか? 考えてみると、少しワクワクします

たとえば、9 月 4 日生まれの場合は、 1988 の場合、対応する自分の 3 バイトは e9、88、および 94 です。とにかく、この方法を自分で使用することもできます

この方法によると、私のキャラクターは良いキャラクターです。あなたはあなた。

この方法によると、なぜ誰もがそれを持っていないのでしょうか? それなら、utf-8 のバイナリ保存規則を読めばわかります

はは、ここをクリックして文字エンコーディングを確認しましょう

無駄なものをたくさん引っ張ってきました。でも実際はそうなんですしかし、今ではそれを直接使用できるようになりました。

文字エンコーディングと ord 関数についてよく理解したので、utf-8 でエンコードされた文字列を切り詰める関数を書いてみましょう。

コードは非常に複雑で最適化する必要がありますが、理解するのは簡単で、貼り付けた後に実行でき、基本的なシナリオが考慮されており、非常に満足です


<?php    $a = "jf我们de没";    /**     * @brief     *     * @param $str 待截取的字符串    * @param $start 字符串开始位置     * @param $num  截取到多长的字符串     *     * @return     */    function utf8_substr($str, $start, $num){        $res = '';      //存储截取到的字符串        $cnt = 0;       //计数器,用来判断字符串是否走到$start位置        $t = 0;         //计数器,用来判断字符串已经截取了$num的数量        for($i = 0; $i < strlen($str); $i++){            if(ord($str[$i]) > 127){    //非ascii码时                if($cnt >= $start){     //如果计数器走到了$start的位置                    $res .=$str[$i].$str[++$i].$str[++$i]; //utf-8是三字节编码,$i指针连走三下,把字符存起来                    $t ++;              //计数器++,表示我存了几个字符串了到$num的数量就退出了                }else{                      $i++;               //如果没走到$start的位置,那就只走$i指针,字符不用处理                    $i++;                   }                       $cnt ++;            }else{                  if($cnt >= $start){     //acsii码正常处理就好                    $res .=$str[$i];                    $t++;                   }                       $cnt ++;                                    }                   if($num == $t) break;       //ok,我要截取的数量已经够了,我不贪婪,我退出了        }               return $res;    }    var_dump(utf8_substr($a, 3, 10));   //结果应该是你想要的?>

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。