13

UTF-8 エンコーディングと PHP の strlen() を想定すると、この文字列の長さが 4 になる可能性はありますか?

他の関数ではなく、strlen() についてのみ知りたい

これは文字列です:

$1→2

自分のコンピューターでテストし、UTF-8 エンコーディングを確認しました。得られた答えは 6 です。

上記の文字の一部が 1 未満にカウントされる理由を説明する、strlen のマニュアルや UTF-8 で読んだものは何もありません。

PS: この質問と回答 (4) は、Ebay で購入した ZCE の模擬テストからのものです。

4

6 に答える 6

19

mb_strlen() を使用するのはどうですか?

http://lt.php.net/manual/en/function.mb-strlen.php

ただし、strlen を使用する必要がある場合は、mbstring.func_overload ディレクティブを 2 に設定することで Web サーバーを構成できるため、スクリプトで strlen の使用が mb_strlen に自動的に置き換えられます。

于 2012-06-14T13:27:04.713 に答える
14

あなたが投稿した文字列は 6 文字の長さです: $1�2 (ドル記号、数字の 1、分音符付きの小文字の i、逆さまの疑問符、半分の分数、数字の 2)

その文字列の UTF-8 表現で strlen() が呼び出された場合、結果は 9 になります (おそらく、異なる長さの表現が複数あります)。

ただし、その文字列を ISO 8859-1 または CP1252 として保存する場合、UTF-8 として有効な 6 バイト長のシーケンスになります。これらの 6 バイトを UTF-8 として再解釈すると、$1�2 (ドル記号、数字 1、Unicode 置換文字、数字 2) の 4 文字になります。つまり、単一文字「�」の UTF-8 エンコーディングは、3 文字「�¿½」の ISO-8859-1 エンコーディングと同じです。

多くの場合、UTF-8 デコーダーが有効な UTF-8 データではないデータを読み取ると、置換文字が挿入されます。

元の文字列は、何層もの誤解を経て処理されたようです。UTF-8 以外のデータに対して UTF-8 デコーダーを使用し ($1.2 を生成)、そのデータの分析に使用したものを使用します ($1.½2 を生成)。

于 2012-06-14T21:57:36.403 に答える
10

次のようなマルチバイト文字列関数mb_strlen()を使用する必要があります。

mb_strlen($string, 'UTF-8');
于 2012-06-14T13:28:41.297 に答える
5

質問の準備とそれを読む間のある時点で、何らかのプロセスがその中の非ASCII文字を台無しにした可能性が高いため、質問はもともと4文字の文字列に関するものでした.

置換文字 U+FFFD (�) を UTF-8 でエンコードし、その結果を latin1 で解釈すると、シーケンス�が取得されます。この文字は、たとえば、ファイルからテキストを読み取るときに文字をエンコードしないバイト シーケンスの代わりとして使用されます。起こったことはおそらくこれです:

latin1 テキスト ファイルに保存された元の質問には次のものがありました: $1¢2(¢ は任意の非 ASCII 文字に置き換えることができます)

ファイルは、UTF-8 を使用するプログラムによって読み取られました。¢ に対応するバイトを解釈できなかったため、プログラムはそれを代入してテキストを読み取りました$1�2。このテキストは、UTF-8 を使用して書き出され$1\xEF\xBF\xBD2、ファイルになります。

次に、latin1 のファイルを読み取る 3 番目のプログラムが来て、$1�2.

于 2012-06-14T14:13:22.127 に答える
2

いいえ。

矛盾による証明を使用します。

strlenはバイトをカウントするため、strlenが4の場合、その文字列には正確に4バイトが含まれている必要があります。

UTF8エンコーディングには、文字ごとに少なくとも1バイトが必要です。

私たちはそれを確立しました:

  1. 4バイトあります
  2. 文字は1バイト以上で表されます

...まだ、6文字あります...これは矛盾しています。だから、いや。

ただし、完全に明確ではないのは、表示ソフトウェア(Webブラウザなど)が文字列を解釈するために使用している文字セットです。文字を8ビット未満で表すことができるいくつかの珍しいエンコーディングスキームを使用することができます。この場合、4バイトは6文字として表示される可能性があります。したがって、文字列はutf8である可能性がありますが、ブラウザはそれを、たとえば5ビットの文字セットとして解釈することを決定できます。

于 2012-06-14T14:07:31.197 に答える
1

多くの UTF-8 文字は、1 バイトではなく数バイトを使用します。これが UTF-8 の構成方法です (これが、1 つのセットに非常に多くの文字を含めることができる方法です)。

mb_strlen()代わりに試してください。

于 2012-06-14T13:27:35.650 に答える