U+2028とU+2029の取り扱い
以下の文字は ASCII 範囲外だが、各種の実行環境で改行扱いされることがある。
U+2028 LINE SEPARATOR (行分割子)
U+2029 PARAGRAPH SEPARATOR (段落分割子)
このため、そこで行分割などが発生して予期せぬ挙動になることがある。
Unicode コンソーシアムによる改行文字の取り扱いガイドライン
UNICODE NEWLINE GUIDELINES http://www.unicode.org/reports/tr13/tr13-9.html
回避方法(要件に依存する)
無視する。
削除する。
削除の副作用で前後が繋がって悪影響を及ぼす可能性はある。
別の文字に置き換える。空白、改行(0x0d, 0x0a)、代替文字(U+FFFE)など。
元の文字の保存が必要な場合は、何らかのエスケープを行う。("\u2028" や "
 と書くなど。)
これは場合によっては通常のエスケープとはまた別に行う必要がある。
トラブル発生例とか説明とか
メモ: U+2028,U+2029が含まれるJSONデータをeval関数を使ってデコードするとエラーになる https://php-tips.com/2009/11/23/メモ-u2029が含まれるjsonデータをeval関数を使ってデコー/
JSONPで受け取れない文字? \u2028 https://qiita.com/kjunichi/items/4c9d0cb408fbc846799f
文字列リテラルとU+2028 http://nazomikan.hateblo.jp/entry/2014/03/13/040109
#javascript ココログの2013年1月の記事だけがNG #trouble #solved https://abrakatabura.hatenablog.com/entry/2013/02/17/201801
U+2028/2029とDOM based XSS https://masatokinugawa.l0.cm/2013/09/u2028u2029.domxss.html
ES2019 以降は JSON.parse() で U+2028, U+2029 を改行と同等に扱うようになった。
https://qiita.com/tonkotsuboy_com/items/07f8ef98abf89250b90c#行区切り文字や段落切り文字をエスケープなしに扱えるように---ecma-262構文をjsonのスーパーセットに拡張
Issue 6827: Look into adding a use counter for U+2028 and U+2029 in line terminator contexts https://bugs.chromium.org/p/v8/issues/detail?id=6827
https://www.php.net/manual/ja/migration71.changed-functions.php#migration71.changed-functions.json
json_encode() に新しいオプション JSON_UNESCAPED_LINE_TERMINATORS が追加されました。 JSON_UNESCAPED_UNICODE を指定している場合に、 U+2028 と U+2029 のエスケープを無効にします。
参考
https://unicode.org/charts/PDF/U2000.pdf
#Unicode #文字列操作API