rtrim 関数の落とし穴

WBOY
リリース: 2016-07-28 08:25:48
オリジナル
1191 人が閲覧しました

今日遭遇した問題を簡単に説明します:
私のコードには次のコード スニペットがあります:

<code><span><span><?php</span>
    header(<span>"Content-type:text/html;charset=utf8"</span>);
    <span>echo</span> rtrim(<span>"威、"</span>,<span>"、"</span>);</span></code>
ログイン後にコピー

当初の期待は「power」を出力することでした。しかし、それが裏目に出て、いくつかの文字化けしたコードが出力されました。どうしてこれなの?詳しく説明しましょう。
まず、rtrim 関数の機能を理解する必要があります。その 2 番目のパラメータは文字列であり、その中の各文字が削除される文字として取り出されます。例:

<code><span><span><?php</span><span>echo</span> rtrim(<span>"blakefezabc"</span>, <span>"cab"</span>);
    <span>//output blakefez</span></span></code>
ログイン後にコピー

はい、出力は blakefez です。
この関数の実装は比較的単純です:
①. 最初のパラメータの最後の文字から左方向にトラバースして、そのバイトが 2 番目のパラメータにあるかどうかを判断します。
②. 存在する場合は、そのバイトを削除し、最初のステップに進みます。そうでない場合は終了します。
上記ではバイトを使用していることに注意してください。はい、この関数はマルチバイトセーフではありません。言い換えれば、パラメータ内の一部の文字がマルチバイトである場合、望ましくない結果が発生します。たとえば、冒頭で述べた rtrim (「伟、」、「、」)。 「Wei」と「,」はすべて utf8 エンコードされているためです。つまり、マルチバイト文字です。このうち、「威」のエンコーディングは 0xE5 0xA8 0x81 で、「,」のエンコーディングは 0xE3 0x80 0x81 です。したがって、rtrim 関数から見ると、次のようになります。 rtrim("0xE5 0xA8 0x81 0xE3 0x80 0x81 ", "0xE3 0x80 0x81"); なので、最終的な出力結果は 0xE5 0xA8 となります。このとき、utf8 エンコードに変換すると文字化けしてしまいます。

')​​.addClass('事前番号付け').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i ').text(i)); }; $numbering.fadeIn(1700); }); });

以上、rtrim 関数の落とし穴をその側面も含めて紹介しましたが、PHP チュートリアルに興味のある友人の参考になれば幸いです。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート