From 7c3e709daf8f3a6934648d84128a6664f211c64f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AD=A6=E7=94=B0=20=E6=86=B2=E5=A4=AA=E9=83=8E?= Date: Thu, 29 Oct 2026 23:11:32 +0900 Subject: [PATCH] =?UTF-8?q?intl=20=E3=82=92=E5=8E=9F=E6=96=87=E3=81=AE?= =?UTF-8?q?=E5=A4=89=E6=9B=B4=E3=81=AB=E8=BF=BD=E5=BE=93=20(4=E3=83=95?= =?UTF-8?q?=E3=82=A1=E3=82=A4=E3=83=AB)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- reference/intl/collator/set-strength.xml | 67 +++++++++++++++++++- reference/intl/grapheme/grapheme-extract.xml | 32 +++++++--- reference/intl/grapheme/grapheme-strlen.xml | 36 ++++++++++- reference/intl/grapheme/grapheme-strpos.xml | 53 +++++++++++++++- 4 files changed, 174 insertions(+), 14 deletions(-) diff --git a/reference/intl/collator/set-strength.xml b/reference/intl/collator/set-strength.xml index 74c93d3cfd..609d21ec98 100644 --- a/reference/intl/collator/set-strength.xml +++ b/reference/intl/collator/set-strength.xml @@ -1,6 +1,6 @@ - + Collator::setStrength @@ -205,7 +205,7 @@ $arr = array( 'aò', 'Ao', 'ao' ); $coll = collator_create( 'en_US' ); // デフォルトの強度で配列を並べ替えます -collator_sort( $coll, $arr ); +collator_sort( $coll, $arr ); var_export( $arr ); // 第一段階の強度で配列を並べ替えます @@ -228,6 +228,68 @@ array ( 1 => 'Ao', 2 => 'ao', ) +]]> + + + + Unicode ロケール拡張のキー <literal>ks</literal> で強度を設定する + + 照合強度は、Collator の生成時に、ロケール識別子の中で + Unicode ロケール拡張のキー ks を使って設定することもできます。 + ks の値と Collator + の定数の対応は次のとおりです。 + + + + + + ロケールキーの値 + Collator の定数 + + + + ks-level1Collator::PRIMARY + ks-level2Collator::SECONDARY + ks-level3Collator::TERTIARY + ks-level4Collator::QUATERNARY + ks-identicCollator::IDENTICAL + + + + + Collator::DEFAULT_STRENGTH に相当する ks-* + の値はありません。この強度にするには collator_set_strength + を使う必要があります。 + + +compare($textStyle, $emojiStyle) === 0); // bool(true) + +// setStrength() で一致段階の強度を設定します +$coll1 = new Collator('en_US'); +$coll1->setStrength(Collator::IDENTICAL); +var_dump($coll1->compare($textStyle, $emojiStyle) === 0); // bool(false) + +// ロケール拡張のキー ks で一致段階の強度を設定しても同じです +$coll2 = new Collator('en_US-u-ks-identic'); +var_dump($coll2->compare($textStyle, $emojiStyle) === 0); // bool(false) + +?> +]]> + + &example.outputs; + + @@ -240,6 +302,7 @@ array ( Collator の定数 collator_get_strength + collator_create diff --git a/reference/intl/grapheme/grapheme-extract.xml b/reference/intl/grapheme/grapheme-extract.xml index d77880ab8b..8fb8c21a80 100644 --- a/reference/intl/grapheme/grapheme-extract.xml +++ b/reference/intl/grapheme/grapheme-extract.xml @@ -1,6 +1,6 @@ - + grapheme_extract @@ -52,12 +52,24 @@ - GRAPHEME_EXTR_COUNT (デフォルト) - size は、 + GRAPHEME_EXTR_COUNT (デフォルト) - size は、 抽出するデフォルト書記素クラスタの数です。 - GRAPHEME_EXTR_MAXBYTES - size は、返すバイト数の最大値です。 - GRAPHEME_EXTR_MAXCHARS - size は、返す UTF-8 文字数の最大値です。 + GRAPHEME_EXTR_MAXBYTES - size は、返すバイト数の最大値です。 + GRAPHEME_EXTR_MAXCHARS - size は、返す UTF-8 文字数の最大値です。 + + + GRAPHEME_EXTR_COUNT が制限するのは書記素クラスタ (見た目上の単位) の数であり、 + バイト数ではありません。ひとつの書記素クラスタが多数のバイトにまたがることがあります。 + たとえば、ZWJ シーケンスで構成された家族の絵文字 (👨‍👩‍👧‍👦) は、 + 書記素クラスタとしてはひとつですが 25 バイトあります。 + 取り出す文字列をバイト数の上限に収める必要がある場合は、 + 代わりに GRAPHEME_EXTR_MAXBYTES を使ってください。 + GRAPHEME_EXTR_MAXBYTES は、書記素クラスタを途中で切らずに、上限に収まる分だけを返します。 + ただし、最初の書記素クラスタだけで上限を超える場合は空文字列を返します。 + + @@ -149,11 +161,13 @@ o%CC%88 grapheme_substr - - - Unicode Text Segmentation: Grapheme Cluster Boundaries - - + grapheme_strlen + grapheme_strpos + + + Unicode Text Segmentation: Grapheme Cluster Boundaries + + diff --git a/reference/intl/grapheme/grapheme-strlen.xml b/reference/intl/grapheme/grapheme-strlen.xml index 00da1a65b3..13cb74e224 100644 --- a/reference/intl/grapheme/grapheme-strlen.xml +++ b/reference/intl/grapheme/grapheme-strlen.xml @@ -1,6 +1,6 @@ - + grapheme_strlen @@ -66,6 +66,38 @@ print grapheme_strlen( 'abc' . $char_a_ring_nfd . $char_o_diaeresis_nfd . $char_ 6 ]]> + + 不正な UTF-8 入力の扱い + + grapheme_strlen は、入力が有効な UTF-8 でない場合など、 + 失敗したときに &null; または &false; を返します。 + ICU のエラーの詳細は、intl_get_error_code と + intl_error_name で取得できます。 + + + +]]> + + &example.outputs; + + + + @@ -80,6 +112,8 @@ print grapheme_strlen( 'abc' . $char_a_ring_nfd . $char_o_diaeresis_nfd . $char_ iconv_strlen mb_strlen strlen + intl_get_error_code + intl_error_name diff --git a/reference/intl/grapheme/grapheme-strpos.xml b/reference/intl/grapheme/grapheme-strpos.xml index b7e970a1bc..6a955f5de2 100644 --- a/reference/intl/grapheme/grapheme-strpos.xml +++ b/reference/intl/grapheme/grapheme-strpos.xml @@ -1,6 +1,6 @@ - + grapheme_strpos @@ -56,7 +56,19 @@ locale - &intl.param.grapheme.locale; + + 使用するロケール。ロケールによって、書記素クラスターの定義と文字列の比較方法が変わります。 + 空文字列または &null; を指定すると、デフォルトのロケールを使用します。 + + + ロケール識別子には、照合の挙動を制御する Unicode ロケール拡張のキーを含めることができます。 + なかでも ks キーは照合強度を制御します。 + たとえば en_US-u-ks-identic を指定すると一致段階で比較するようになり、 + 他の強度では同等とみなされる Unicode の異体字セレクタの違い + (絵文字表示とテキスト表示など) を区別します。 + ks の値と照合強度の対応の一覧は、 + Collator::setStrength を参照ください。 + @@ -117,6 +129,42 @@ print grapheme_strpos( $char_a_ring_nfd . $char_a_ring_nfd . $char_o_diaeresis_n 2 ]]> + + <literal>ks-identic</literal> ロケールキーで異体字セレクタを区別する + + デフォルトでは、Unicode の異体字セレクタ (テキスト表示の U+FE0E、絵文字表示の U+FE0F) + は比較の際に無視されます。ロケール拡張のキー ks-identic + を使うと一致段階で照合するようになり、異体字セレクタの違いを区別します。 + + + + locale 引数は PHP 8.5.0 以降で利用可能です。 + + + + +]]> + + &example.outputs; + + + + @@ -128,6 +176,7 @@ print grapheme_strpos( $char_a_ring_nfd . $char_a_ring_nfd . $char_o_diaeresis_n grapheme_strripos grapheme_strrpos grapheme_strstr + Collator::setStrength Unicode Text Segmentation: Grapheme Cluster Boundaries