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

PHP の文字列、エンコーディング、UTF-8

大家讲道理
大家讲道理オリジナル
2017-01-23 14:58:071630ブラウズ

最近コーディングに関する記事をよく読んだので、「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 = &#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";

文字列変換

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 string の本質

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

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

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

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