リーリー
3つの違いと相互に変換できるかどうかを詳しく説明していただけますか
3つの違いと相互に変換できるかどうかを詳しく説明していただけますか
segmentfault に関する質問に初めて回答しました。 。
PHP 文字列変数、二重引用符、一重引用符は意味が異なります
二重引用符を使用する場合、それらはエスケープされます。一重引用符を使用する場合、それらはエスケープされません。
二重引用符を使用する場合、$xxxx テキストは対応する変数の値に置き換えられます。
例
リーリー質問に戻りますが、
UTF-8 における漢字「中」の 16 進エンコードは 0xe4、0xb8、0xad です
したがって、二重引用符で囲まれた文字列では、x の先頭は「中」としてエスケープされます。で始まる文字列であることを16進数で表現した文字はHTMLの&xe4;と同じです
シングルクォート文字列ではxe4xb8xadがそのまま出力されます
エンコーディングが UTF-8 未満の場合、str1 と str3 は等価です。直接エコーすると、バイナリレベルでの 3 バイトの比較であれば、文字列も完全に等しくなります。 PHP はローカルで直接エンコードされたバイナリ ストレージです
環境エンコーディングが非 UTF-8 (GBK など) の場合、str1 は基本的に文字化けしたコードであり、str1 と str3 は同等ではなくなります
str2 に関しては、常に 'xe4xb8xad' (引用符なし) が出力されます。一重引用符で囲まれた文字列では、一重引用符自体を ' にエスケープする必要があるだけです。それ以外の場合は、通常の文字として扱われます。
最初と二番目の違い、つまり一重引用符と二重引用符の違いのみを説明してください
二重引用符: 内側の引用符はエスケープされます
一重引用符: 内側の引用符はエスケープされません
x
后跟着十六进制数字的属于转义字符,转义字符只有在双引号"
中才起作用。单引号中只有对单引号本身'
和反斜杠 のエスケープは有効ですが、それ以外は無効です。
PHP自体は文字エンコーディングを区別しません。つまり$str1
是一个三字节的字符串,字符串的三个字节分别是(十六进制编码)E4 B8 AD
。如果在UTF-8编码中,就是中
という言葉です。他のエンコーディングでは必ずしもそうであるとは限りません。
そして $str2
は 12 バイトの文字列で、入力した文字です。
そして$str3
则是一个字符串,如果你把文件以UTF-8编码保存,那就和$str1
是一样。如果你以GBK保存,那就是两个字节的D6 D0
,如果你以BIG5保存,就是A4 A4
。
UTF-8、GBK、BIG5、あるいは他の多くの言語エンコーディングであっても、すべて EUC に従います。つまり、ASCII 文字のエンコーディングは一貫しているため、保存にどのエンコーディングが使用されても、PHP には影響しません。コードの作業には影響しません。ただし、非 ASCII 文字には大きな違いがあります。
したがって、PHP で非 ASCII 文字が正常に表示されるようにするには、保存エンコーディングと出力エンコーディングが一貫していることを確認する必要があります。出力が HTML の場合、エンコーディングは meta
タグまたは HTTP ヘッダーで宣言されます。一致していないと文字化けが発生します。