U+2028とU+2029の取り扱い
以下の文字は ASCII 範囲外だが、各種の実行環境で改行扱いされることがある。
U+2028 LINE SEPARATOR (行分割子)
U+2029 PARAGRAPH SEPARATOR (段落分割子)
このため、そこで行分割などが発生して予期せぬ挙動になることがある。
Unicode コンソーシアムによる改行文字の取り扱いガイドライン
回避方法(要件に依存する)
無視する。
削除する。
削除の副作用で前後が繋がって悪影響を及ぼす可能性はある。
別の文字に置き換える。空白、改行(0x0d, 0x0a)、代替文字(U+FFFE)など。
元の文字の保存が必要な場合は、何らかのエスケープを行う。("\u2028" や "
 と書くなど。)
これは場合によっては通常のエスケープとはまた別に行う必要がある。
トラブル発生例とか説明とか
ES2019 以降は JSON.parse() で U+2028, U+2029 を改行と同等に扱うようになった。
json_encode() に新しいオプション JSON_UNESCAPED_LINE_TERMINATORS が追加されました。 JSON_UNESCAPED_UNICODE を指定している場合に、 U+2028 と U+2029 のエスケープを無効にします。
参考