数字の言語は、英語、日本語、その他の言語であろうと、多くの文字で構成されています。したがって、数値言語を扱う場合、基本的な質問は、各文字を数値的に表現する方法です。過去には、英語のキャラクターしか表していませんでしたが、今では物事が非常に異なっており、結果は複数の異なる言語でキャラクターを表すための見事なキャラクターエンコードスキームです。 PHPはこれらの異なるスキームをどのように関連付け、処理しますか?
キーポイント
基本
「ビット」は0または1であり、「バイト」は8つの連続したビットの組み合わせであることを知っています。バイトには8つの二重値ビットがあるため、合計256の異なるモード(2の8番目の電力)でバイトを構成できます。可能な8ビットモードごとに異なる文字を関連付けることができます。これらのバイトをさまざまな注文にまとめると、独自のコミュニケーション方法があります。それは必ずしも賢いわけではなく、誰が両端にいるかに依存しますが、コミュニケーションです。 256以下のユニークなキャラクターを持つ言語でキャラクターを表現できる限り、私たちは成功します。しかし、たった256文字で言語を表現できない場合はどうなりますか?または、同じドキュメントで複数の言語を表現する必要がある場合はどうなりますか?今日、私たちが見つけることができるすべてをデジタル化するにつれて、256文字は十分ではありません。幸いなことに、この課題をよりよく満たすキャラクタースキームが設計されています。これらの新しいSuperCharacterセットは、1〜4バイトを使用して文字を定義します。今日、キャラクターエンコーディングの分野の大物はUnicodeです。これは、複数のバイトを使用して文字を表すソリューションです。 Unicode Consortiumによって開発され、UTF-32(Dreadnaught Class Starship用)、UTF-16(Star Trekのエンタープライズ:Dark Unboundのため)、UTF-8(私たちのほとんどの人が実際に使用する必要があります。 Webアプリケーションの世界)。私が言ったように、Unicode(UTF-8を含む)は複数のバイト構成を使用して文字を表します。 UTF-8は、1〜4バイトを使用して1,112,064パターンを生成して、異なる文字を表します。これらの「ワイドキャラクター」はより多くのスペースを占有しますが、UTF-8は他のエンコードスキームよりも速く処理する傾向があります。なぜ誰もがUTF-8を賞賛するのですか?その一部は、ESPNとTCMで見られるUTF-8対応広告で強調されている人気モデルですが、主にUTF-8はASCIIを模倣しています。
これはPHPにどのような影響を与えますか?
私はあなたが何を考えているか知っています。メタタグでキャラクターセットを「UTF-8」に設定するだけで、すべてが問題ありません。しかし、これは真実ではありません。まず、単純な事実は、PHPがマルチバイト文字を処理するように実際には設計されていないため、標準の文字列関数を使用してこれらの文字を動作させると不確実な結果が生じる可能性があります。これらのマルチバイト文字を処理する必要がある場合、特別な関数セットであるMbString関数を使用する必要があります。第二に、たとえあなたがPHPを制御していても、まだ問題があるかもしれません。通信をオーバーライドするHTTPヘッダーには、ページメタタグのコンテンツをオーバーライドする文字セットIDも含まれています。それでは、PHPはマルチバイト文字をどのように処理しますか?マルチバイト文字列に影響を与える機能の2つのセットがあります。最初のものはiconvです。バージョン5.0から始めて、これは言語のデフォルトの部分になりました。これは、ある文字セットを別の文字セット表現に変換する方法です。これは、この記事で説明するものではありません。 2つ目は、「MB_」が付いた一連のコマンドであるマルチバイトサポートです。これらのコマンドの多くがあり、クイックレビューでは、それらのいくつかは特定のエンコードスキームに基づいてキャラクターが適切であるかどうかを判断することに関連していることが示されていますが、他のものはPHP正規表現の一部と同様の検索指向関数ですが、マルチバイト関数です。
php
のマルチバイトサポートを有効にしますマルチバイトサポートは、PHPのデフォルト機能ではありませんが、追加のライブラリまたは拡張機能をダウンロードする必要もありません。残念ながら、PHPのマネージドバージョンを使用している場合、これはできることではないかもしれません。 phpinfo()関数を使用して、構成を表示します。下にスクロールして出力を途中でスクロールすると、「mbstring」というセクションがあります。これにより、基本機能が有効になっているかどうかがわかります。この機能を有効にする方法については、マニュアルを参照できます。要するに、-enable-mbstringコンパイル時間オプションを使用して、ランタイム構成オプションmbsstring-encoding_translationを設定することにより、MB関数を有効にすることができます。もちろん、最終的な解決策はPHP 6です。IBM(帽子を脱いでください)ICUライブラリを使用して、マルチバイト文字セットのネイティブサポートを確保するためです。私たちがしなければならないのは座って待つことだけですよね?しかし、それまでは、今すぐ利用できるマルチバイトサポートをご覧ください。
マルチバイト文字列コマンド
53の異なるマルチバイト文字列コマンドがある場合があります。 54があるかもしれません。私はある時点で少し邪魔にならなかったが、あなたは私が言っていることを手に入れた。言うまでもなく、私たちはそれを1つずつ説明することはありませんが、楽しみのために、いくつかを簡単に見てみましょう。
mb_check_encoding()関数は、特定のエンコードシーケンスがエンコードスキームに有効かどうかを判断するためにチェックします。この関数は、文字列のエンコード(またはどのスキームが機能するか)をどのようにエンコードするかはわかりませんが、指定されたスキームで機能するかどうかがわかります。
<?php $string = 'u4F60u597Du4E16u754C'; $string = json_decode('"' . $string . '"'); $valid = mb_check_encoding($string, 'UTF-8'); echo ($valid) ? 'valid' : 'invalid'; ?>
PHPマニュアルにサポートされているエンコーディングのリストを見つけることができます。
strlen()関数は、文字列内のバイト数を返します。単一のバイトであるASCIIの場合、これは文字の数を見つけることをお勧めします。マルチバイト文字列の場合、MB_STRLEN()関数を使用する必要があります。
<?php $string = 'u4F60u597Du4E16u754C'; $string = json_decode('"' . $string . '"'); $valid = mb_check_encoding($string, 'UTF-8'); echo ($valid) ? 'valid' : 'invalid'; ?>
mb_ereg_search()関数は、従来の文字検索のマルチバイトバージョンを実行します。ただし、いくつかの注意事項があります - MB_REGEX_ENCODING()関数を使用してエンコードスキームを指定する必要があります。正規表現にはセパレーターがありません(単なるパターンパーツ)。
<?php $string = 'u4F60u597Du4E16u754C'; $string = json_decode('"' . $string . '"'); echo strlen($string); // 输出 12 – 错误! echo mb_strlen($string, 'UTF-8'); // 输出 4 ?>
それで十分ですか?
私はあなたがどのようになっているのかわかりませんが、世界は本当にもっと簡単なものを必要としていると思います。残念ながら、マルチバイト処理はこの要件を満たしていません。しかし今のところ、これはあなたが無視できないものです。通常のPHP文字列処理を実行できない場合があります(通常のASCII範囲を超える文字(U 0000 - U 00FF)を処理しようとしているためです。これは、MB_指向の関数を使用する必要があることを意味します。もっと知りたいですか?真剣に、あなたはしたいですか?これはあなたを怖がらせると本当に思っていました。私はこれに対して準備ができていませんでした。私の時が来ました。あなたの最良の選択は何ですか? PHPマニュアルをご覧ください。ああ、何かを試してみてください。実際に何かを使用している経験を置き換えるものは何もありません。
(元のFAQパーツは、その内容が記事のトピックに非常に関連しており、書き換え後に読みやすさを減らすため、ここで保持する必要があります。)
以上がPHPマスター|マルチバイト文字列を使用しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。