最近コーディングに関する記事をよく読んだので、「PHP、文字列、エンコーディング、UTF-8」関連の知識について2つのブログ記事に分けてお話します。このブログ記事は前半であり、分割されています。 「文字列の定義と使用」、「文字列の変換」、「PHP 文字列の本質」、「マルチバイト文字列」の 4 つの主要な部分に分かれています。前半は比較的基本的な内容です。
PHPで文字列を設定するには4つの方法があります:
一重引用符で囲まれた文字列
一重引用符で囲まれた文字列はPythonの元の文字列に似ています、つまり一重引用符を持たない文字列です。変数解析関数と特殊文字エスケープ関数。たとえば、 $str='hellonworld', n には改行関数がありません。
ダブルクォートされた文字列
ダブルクォーテーションされた文字列には、シングルクォーテーションされた文字列にはない変数解析機能と特殊文字エスケープ機能があります。
16 進数と 8 進数の文字列の特別なエスケープに非常に興味があります。特別な追加:
\[0-7]{1,3} #八进制表达方式 \x[0-9A-Fa-f]{1,2} #十六进制表达方式
heredoc
この式は Python の長い文字列に似ており、複数行の文字列を定義できます。文法上の定義は非常に厳密なので、使用する場合は注意が必要です。
$str=<<<EOD hello\n world EOD;
Nowdoc
Nowdocは一重引用符で囲まれた文字列に似ており、変数を解析しません。特殊文字をエスケープせずにテキストの大部分を定義する場合に適しています。
変数解析
PHP文字列の最も強力な部分は変数解析であり、実行時にコンテキストに応じて変数を解析でき、これにより多くの素晴らしい用途が生まれます。
単純な変数解析とは、文字列に「変数」、「配列」、「オブジェクトのプロパティ」を含めることができることを意味し、複雑な文法規則では、操作(式の形成)に {} 記号を使用します。
変数解析の威力を見てみましょう
class beers { const softdrink = 'softdrink'; public static $ale = 'ale'; public $data = array(1,3,"k"=>4); } $softdrink = "softdrink"; $ale = "ale"; $arr = array("arr1","arr2","arr3"=>"arr4","arr4"=>array(1,2)); $arr4 = "arr4"; $obj = new beers; echo "line1:{$arr[1]}\n"; echo "line2:{$arr['arr4'][0]}\n"; echo "line3:{$obj->data[1]}\n"; echo "line4:{${$arr['arr3']}}\n"; echo "line5:{${$arr['arr3']}[1]}\n"; echo "line6:{${beers::softdrink}}\n"; echo "line7:{${beers::$ale}}\n";
PHP 言語が Python よりも単純であるもう 1 つの理由は、型の暗黙的な変換です。これにより、多くの操作が簡素化されます。ここでは、文字列変換を通じてそれを説明します。 。
文字列型の強制
$var = 10 ; $dvar = (string)$var ; echo $dvar . "_" . gettype($dvar);
strval()関数は変数の文字列値を取得することです:
$var = 10.2 ; $dvar = strval($var) ; echo gettype($var) . "_" . $dvar . "_" . gettype($dvar);
settype()関数は変数の型を設定します:
$str = "10hello"; settype($str, "integer"); echo $str ;
強制のプロセス中型変換、その他の型は、値が文字列に変換されるときに特定の規則に従います。たとえば、ブール値 TRUE は文字列「1」に変換されます。関連するルールを理解しておくことが最善です。
自動型変換
上記の2つの変換は表示変換ですが、さらに注意すべきは自動型変換です。文字列を必要とする式では、自動的に型に変換されます。 、例を参照してください:
$bool = true; $str = 10 + "hello" echo $bool . "_" . $str ;
PHP ドキュメントから説明を引用します:
PHP における string の実装は、バイトの配列とバッファ長を示す整数です。バイトを文字に変換する方法に関する情報はなく、プログラマが決定する必要があります。文字列内のどこにでも出現できる値 0 のバイトなど、文字列を構成する値に制限はありません。
PHP は文字列のエンコードを指定しません。文字列がどのようにエンコードされるかはプログラマによって異なります。文字列は、PHP ファイルのエンコードに従ってエンコードされます。たとえば、ファイルのエンコードが GBK の場合、コードの内容は GBK になります。
バイナリ セーフティの概念を補足すると、値 0 (NULL) のバイトは文字列内の任意の位置に存在することができ、PHP の一部の非バイナリ関数の最下層は呼び出される C 関数です。 NULL の後の文字は無視されます。
PHP のファイルエンコーディングが ASCII と互換性がある限り、文字列操作は適切に処理できます。ただし、文字列操作は (ファイルのエンコードが何であっても) 本質的にはネイティブであるため、使用するときは注意する必要があります:
一部の関数は文字列がシングルバイトでエンコードされていることを前提としていますが、その必要はありません。バイトを変換 特定の文字として解釈されます。たとえば、sbustr() 関数です。
多くの関数はエンコードパラメータを明示的に渡す必要があります。そうでない場合、htmlentities() 関数などのデフォルト値が PHP.INI ファイルから取得されます。
ローカル領域に関連する関数もいくつかあり、これらの関数はシングルバイトでのみ動作します。
通常の状況では、PHP は内部的に Unicode 文字をサポートしていませんが、UTF-8 エンコーディングをサポートしています。ほとんどの場合、問題はありませんが、次の状況は処理されない可能性があります。 UTF -8 でエンコードされた文字列を変換する方法
UTF-8 でエンコードされた Web ページですが、ユーザーがフォームを送信するときに GBK エンコードを使用する場合があります (メタ タグに準拠していません)
UTF-8 でエンコードされた PHPファイル、strlen("China") を使用すると、実際の文字数 (2) ではなく 6 が返されます
では、この問題を解決するにはどうすればよいでしょうか? PHP は mbstring 拡張機能を提供します。
mbstring 拡張機能はデフォルトでは有効になっていません。インストール時に --enable-mbstring が必要です。
まずはPHP.INIのmbstringディレクティブの構成を見てみましょう 徐々に理解するのに時間がかかりました。
mbstring. language このパラメータは UTF-8 であると理解しています
mbstring.internal_encoding このエンコードは PHP ファイルのエンコードとは関係ありませんが、ほとんどの mbstring 関数では、処理する文字列のエンコードを指定する必要があります明示的な指定がない場合、このパラメータの値は、PHP の上位バージョンでは、default_charset パラメータに置き換えられます。
mbstring.http_input このパラメーターは、HTTP 入力 (GET パラメーターを除く) のデフォルトのエンコーディングを指定します。通常、HTML ページのエンコーディングと一致しており、このパラメータの値は、default_charset パラメータに置き換えられます。
mbstring.http_output このパラメータは私を誤解させます。PHP 出力は単なるページではないのですか?
mbstring.encoding_translation、このパラメータに注目してみましょう。これがデフォルトでオフになっている場合、PHP は POST 変数のエンコーディングとアップロードされたファイルの名前を mbstring で指定された値に自動的に変換します。 .internal_encoding ただし、テストはしていません。中国語の名前のファイルをアップロードできます。これを閉じて、関連する問題をプログラマに対処させることをお勧めします。
後で mbstring によって拡張されたいくつかの関数を見てみましょう:
mb_http_input(): HTTP 入力文字エンコーディングを検出し、ファイルアップロードのファイル名を処理する必要があることを感じます。
mb_convert_encoding(): よく使用される関数で、3 番目のパラメーターに注意してください。
mb_detect_order(): 文字エンコーディングの検出順序を設定/取得します。
mb_list_encodings(): システムでサポートされているエンコーディング リストを返します。
重要な注意事項: PHP ファイルは特定のエンコーディングをサポートし、ASCII 互換である必要があります。
ただし、特に文字列が識別子またはリテラルの形式で表示される場合は、PHP ファイルのエンコーディングとして BIG-5 を使用しないでください。PHP ファイルのエンコーディングが実際に BIG-5 である場合は、入力および出力コンテンツを UTF に変換してみてください。 -8.
最後に、Zend Multibyte の概念について話しますが、私はあまり深く理解していません。まず、mbstring 拡張子と混同しないでください。 Zend マルチバイト モードはデフォルトではオフになっていますが、zend.multibyte コマンドを使用してオンにできます。次に、declare() 関数を使用して PHP パーサーのエンコーディングを指定します。
では、この命令にはどんな意味があるのでしょうか?上で述べたように、PHP ファイルのエンコーディングは ASCII 互換である必要があるため、BIG-5 のような互換性のない ASCII エンコーディングをどうするかは、PHP パーサーが mbstring.script_encoding エンコーディングを読み取ってこれを使用するときに実行できます。 PHP ファイルを解析するためのエンコーディング。