ホームページ  >  記事  >  バックエンド開発  >  PHP の文字列、エンコーディング、UTF-8 コードの詳細な説明

PHP の文字列、エンコーディング、UTF-8 コードの詳細な説明

黄舟
黄舟オリジナル
2017-03-06 09:54:582545ブラウズ

最近コーディングに関する記事をよく読んでいるので、「PHP、文字列、エンコーディング、UTF-8」関連の知識について 2 つのブログ記事に分けて説明します。このブログ記事は前半で、大きく 4 つの部分に分かれています。つまり、「文字列の定義と使用」、「文字列変換」、「PHP 文字列の性質」、「マルチバイト文字列」です。前半は比較的基本的なもので、次の記事「PHP と UTF-8 のベスト プラクティス」に詳細な情報が記載されている可能性があります。

文字列の定義と使用法

PHP で文字列を設定するには 4 つの方法があります:

一重引用符文字列

一重引用符で囲まれた文字列は、Python の生の文字列に似ています。つまり、一重引用符で囲まれた文字列には、変数解析関数や特殊文字エスケープ関数がありません。たとえば、 $str='hellonworld', n には改行関数がありません。

二重引用符文字列

二重引用符で囲まれた文字列には、一重引用符で囲まれた文字列にはない変数解析関数と特殊文字エスケープ関数があります。

個人的には、16 進数と 8 進数の文字列の特殊なエスケープに非常に興味があります。特別な追加:

\[0-7]{1,3} #八进制表达方式
\x[0-9A-Fa-f]{1,2} #十六进制表达方式

ヒアドキュメント

この式は Python の長い文字列に似ており、複数行を含む文字列を定義できます。文法上の定義は非常に厳密なので、使用する場合は注意が必要です。

りー

ナウドック

Nowdoc は一重引用符で囲まれた文字列に似ており、変数を解析しません。特殊文字をエスケープせずにテキストの大部分を定義する場合に適しています。

変数分析

PHP 文字列の最も強力な部分は変数解析です。変数解析では、実行時のコンテキストに応じて変数を解析できます (これはインタープリタ型言語です)。これにより、多くの素晴らしい用途が生まれます。

単純な変数解析とは、文字列に「変数」、「配列」、および「オブジェクト属性」を含めることができることを意味し、複雑な構文規則では、演算に (式の形成に) {} 記号が使用されます。

例を通して変数解析の威力を見てみましょう

$str=<<<EOD
hello\n
world
EOD;

文字列変換

PHP 言語が Python よりも単純であるもう 1 つの理由は、型の暗黙的な変換であり、これにより多くの操作が簡素化されます。これについては、ここでは文字列変換を通じて説明します。

文字列型強制

class beers {
    const softdrink = &#39;softdrink&#39;;
    public static $ale = &#39;ale&#39;;
    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[&#39;arr4&#39;][0]}\n"; 
echo "line3:{$obj->data[1]}\n";
echo "line4:{${$arr[&#39;arr3&#39;]}}\n";
echo "line5:{${$arr[&#39;arr3&#39;]}[1]}\n";
echo "line6:{${beers::softdrink}}\n";
echo "line7:{${beers::$ale}}\n";

strval() 関数は、変数の文字列値を取得します:

$var = 10 ;
$dvar = (string)$var ;
echo $dvar . "_" . gettype($dvar);

settype() 関数は、変数の型を設定します:

$var = 10.2 ;
$dvar = strval($var) ;
echo gettype($var) . "_" . $dvar . "_" . gettype($dvar);

強制的な型変換のプロセスでは、他の型の値を文字列に変換するときに、特定のルールに従います。たとえば、TRUE のブール値は文字列「1」に変換されます。関連するルールを理解しておくことが最善です。

自動型変換

上記の 2 つの変換は表示変換ですが、さらに注意が必要なのは、文字列を必要とする式では自動的に型に変換されます。詳しくは、

$str = "10hello";
settype($str, "integer");
echo $str ;

の例を参照してください。 PHP文字列の本質

PHP ドキュメントからの説明を引用します:

PHP の文字列は、バイトの配列にバッファ長を指定する整数を加えたものとして実装されます。バイトを文字に変換する方法に関する情報はなく、プログラマが決定する必要があります。文字列内のどこにでも出現できる値 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 このパラメータは、HTTP 出力とは何ですか? 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 マルチバイト

最後に、Zend Multibyte の概念について話します。私はそれをあまり深く理解していません。まず、これを mbstring 拡張子と混同しないでください。 Zend マルチバイト モードはデフォルトではオフになっていますが、zend.multibyte コマンドを使用してオンにできます。次に、declare() 関数を使用して PHP パーサーのエンコーディングを指定します。

では、この指示にはどのような意味があるのでしょうか?上で述べたように、PHP ファイルのエンコーディングは ASCII 互換である必要があるため、BIG-5 のような互換性のない ASCII エンコーディングをどうするかは、PHP パーサーが mbstring.script_encoding エンコーディングを読み取ってこれを使用するときに実行できます。 PHP ファイルを解析するためのエンコーディング。

上記は、PHP の文字列、エンコーディング、および UTF-8 コードの詳細な説明です。さらに関連するコンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。


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