検索
ホームページバックエンド開発PHPチュートリアルPHP の文字列、エンコーディング、UTF-8

最近コーディングに関する記事をよく読んだので、「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 までご連絡ください。
PHP対Python:違いを理解しますPHP対Python:違いを理解しますApr 11, 2025 am 12:15 AM

PHP and Python each have their own advantages, and the choice should be based on project requirements. 1.PHPは、シンプルな構文と高い実行効率を備えたWeb開発に適しています。 2。Pythonは、簡潔な構文とリッチライブラリを備えたデータサイエンスと機械学習に適しています。

PHP:それは死にかけていますか、それとも単に適応していますか?PHP:それは死にかけていますか、それとも単に適応していますか?Apr 11, 2025 am 12:13 AM

PHPは死にかけていませんが、常に適応して進化しています。 1)PHPは、1994年以来、新しいテクノロジーの傾向に適応するために複数のバージョンの反復を受けています。 2)現在、電子商取引、コンテンツ管理システム、その他の分野で広く使用されています。 3)PHP8は、パフォーマンスと近代化を改善するために、JITコンパイラおよびその他の機能を導入します。 4)Opcacheを使用してPSR-12標準に従って、パフォーマンスとコードの品質を最適化します。

PHPの未来:適応と革新PHPの未来:適応と革新Apr 11, 2025 am 12:01 AM

PHPの将来は、新しいテクノロジーの傾向に適応し、革新的な機能を導入することで達成されます。1)クラウドコンピューティング、コンテナ化、マイクロサービスアーキテクチャに適応し、DockerとKubernetesをサポートします。 2)パフォーマンスとデータ処理の効率を改善するために、JITコンパイラと列挙タイプを導入します。 3)パフォーマンスを継続的に最適化し、ベストプラクティスを促進します。

PHPの抽象クラスまたはインターフェイスに対して、いつ特性を使用しますか?PHPの抽象クラスまたはインターフェイスに対して、いつ特性を使用しますか?Apr 10, 2025 am 09:39 AM

PHPでは、特性は方法が必要な状況に適していますが、継承には適していません。 1)特性により、クラスの多重化方法が複数の継承の複雑さを回避できます。 2)特性を使用する場合、メソッドの競合に注意を払う必要があります。メソッドの競合は、代替およびキーワードとして解決できます。 3)パフォーマンスを最適化し、コードメンテナビリティを改善するために、特性の過剰使用を避け、その単一の責任を維持する必要があります。

依存関係噴射コンテナ(DIC)とは何ですか?また、なぜPHPで使用するのですか?依存関係噴射コンテナ(DIC)とは何ですか?また、なぜPHPで使用するのですか?Apr 10, 2025 am 09:38 AM

依存関係噴射コンテナ(DIC)は、PHPプロジェクトで使用するオブジェクト依存関係を管理および提供するツールです。 DICの主な利点には、次のものが含まれます。1。デカップリング、コンポーネントの独立したもの、およびコードの保守とテストが簡単です。 2。柔軟性、依存関係を交換または変更しやすい。 3.テスト可能性、単体テストのために模擬オブジェクトを注入するのに便利です。

通常のPHPアレイと比較して、SPL SPLFIXEDARRAYとそのパフォーマンス特性を説明してください。通常のPHPアレイと比較して、SPL SPLFIXEDARRAYとそのパフォーマンス特性を説明してください。Apr 10, 2025 am 09:37 AM

SplfixedArrayは、PHPの固定サイズの配列であり、高性能と低いメモリの使用が必要なシナリオに適しています。 1)動的調整によって引き起こされるオーバーヘッドを回避するために、作成時にサイズを指定する必要があります。 2)C言語アレイに基づいて、メモリと高速アクセス速度を直接動作させます。 3)大規模なデータ処理とメモリに敏感な環境に適していますが、サイズが固定されているため、注意して使用する必要があります。

PHPは、ファイルを安全に処理する方法をどのように処理しますか?PHPは、ファイルを安全に処理する方法をどのように処理しますか?Apr 10, 2025 am 09:37 AM

PHPは、$ \ _ファイル変数を介してファイルのアップロードを処理します。セキュリティを確保するための方法には次のものが含まれます。1。アップロードエラー、2。ファイルの種類とサイズを確認する、3。ファイル上書きを防ぐ、4。ファイルを永続的なストレージの場所に移動します。

Null Coulescingオペレーター(??)およびNull Coulescing Assignment Operator(?? =)とは何ですか?Null Coulescingオペレーター(??)およびNull Coulescing Assignment Operator(?? =)とは何ですか?Apr 10, 2025 am 09:33 AM

JavaScriptでは、nullcoalescingoperator(??)およびnullcoalescingsignmentoperator(?? =)を使用できます。 1.??最初の非潜水金または非未定されたオペランドを返します。 2.??これらの演算子は、コードロジックを簡素化し、読みやすさとパフォーマンスを向上させます。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。