0

を使用して文字列から n 文字を抽出しようとしてい substr($originalText,0,250)ます。

n 番目の文字はエンダッシュです。したがって、メモ帳で表示すると、最後の文字は †となります。私のエディタ、Brackets では、UTF-8 エンコーディングしかサポートしていないため、ログ ファイルを開くことさえできません。

この文字列に対して json_encode を実行することもできません。

ただし、 を使用するsubstr($originalText,0,251)と、問題なく動作します。ログ ファイルを開くと、†の代わりに en-dash が表示されます。json_encode も正常に動作します。

問題を回避するために使用できますmb_convert_encoding($mystring, "UTF-8", "Windows-1252")が、これらの文字を最後に使用すると特にエラーが発生する理由を誰か教えてもらえますか? さらに、これを行うと、ログ ファイルに「括弧内」が表示されますが、これも混乱を招きます。

私の質問は、なぜ文字列の最後に en-dash があるのか​​ということです。他の場所 (その後に他の文字が続く) とは異なります。

うまくいけば、私の質問は明確です。そうでない場合は、さらに説明してみてください。

ありがとう。

4

2 に答える 2

4

UTF-8は、より多くの文字に対応するために ASCII を超えてコードページを拡張する、いわゆるサロゲートを使用します。

単一の UTF-8 文字は、文字に応じて 1、2、3、または 4 バイトにコード化できます。

マルチバイト文字の真ん中で文字列を切り取ります。

[<-character->]
[byte-0|byte-1]
       ^
      You cut the string right here in the middle!


[<-----character---->]
[byte-0|byte-1|byte-2]
       ^      ^
      Or anywhere here if it's 3 bytes long.

したがって、デコーダーには最初のバイトがありますが、文字列が途中で終了するため、文字全体を読み取ることができません。

これは、あなたが目撃しているすべての効果を引き起こします。

この問題の解決策は、Dezza の回答にあります。

于 2016-10-14T13:32:14.690 に答える