[2] 
[[Unicode]] の [[UCD]] の[[特性][特性 (UCD)]] [DFN[[CODE[Script]]]],
[DFN[[CODE[Script_Extensions]]]]
は、
[[文字]] ([[Unicode符号点]])
の[[用字系]]を表すものです。

* 仕様書

[REFS[
- [1] [CITE@en-us[UAX #24: Unicode Script Property]], [TIME[2022-08-25T17:19:20.000Z]], [TIME[2022-11-12T08:17:01.692Z]] <https://www.unicode.org/reports/tr24/>
-- [4] [CITE@en-us[UAX #24: Unicode Script Property]], [TIME[2022-08-25T17:19:20.000Z]], [TIME[2022-11-12T08:20:20.575Z]] <https://www.unicode.org/reports/tr24/#Out_of_Scope>
-- [7] [CITE@en-us[UAX #24: Unicode Script Property]], [TIME[2022-08-25T17:19:20.000Z]], [TIME[2022-11-12T08:22:52.781Z]] <https://www.unicode.org/reports/tr24/#Script>
--- [11] 
[CITE@en-us[UAX #24: Unicode Script Property]], [TIME[2022-08-25T17:19:20.000Z]], [TIME[2022-11-12T12:29:16.984Z]] <https://www.unicode.org/reports/tr24/#Values>
--
[23] 
[CITE@en-us[UAX #24: Unicode Script Property]], [TIME[2022-08-25T17:19:20.000Z]], [TIME[2022-11-12T12:45:53.860Z]] <https://www.unicode.org/reports/tr24/#Script_Extensions>
--
[37] 
[CITE@en-us[UAX #24: Unicode Script Property]], [TIME[2022-08-25T17:19:20.000Z]], [TIME[2022-11-12T13:34:54.754Z]] <https://www.unicode.org/reports/tr24/#Data_File>
-- [43] 
[CITE@en-us[UAX #24: Unicode Script Property]], [TIME[2022-08-25T17:19:20.000Z]], [TIME[2022-11-13T08:51:06.816Z]] <https://www.unicode.org/reports/tr24/#Multiple_Script_Values>
- [44] [CITE@en-us[UTS #18: Unicode Regular Expressions]], [TIME[2022-02-08T14:02:12.000Z]], [TIME[2022-11-13T08:51:28.700Z]] <https://unicode.org/reports/tr18/#Script_Property>
- [79] [CITE@en[[[perlunicode]] - Unicode support in Perl - Perldoc Browser]], [TIME[2022-11-13T11:35:58.000Z]] <https://perldoc.perl.org/perlunicode#Scripts>
- [10] [TIME[2022-04-27T15:40:26.000Z]], [TIME[2022-11-12T09:10:21.801Z]] <https://www.unicode.org/Public/UCD/latest/ucd/Scripts.txt>
- [41] [TIME[2022-02-15T16:27:34.000Z]], [TIME[2022-11-12T13:34:09.336Z]] <https://www.unicode.org/Public/UCD/latest/ucd/ScriptExtensions.txt>


]REFS]

* [CODE[Script]] 特性

[3] 
[DFN[[CODE[Script]]]]
([[別名]]: [DFN[[CODE[sc]]]])
は[[カタログ]]型の[[特性]]です [SRC[>>7]]。
[[特性値]]は[[Unicode用字系特性値]]です。

[26] 
[CODE[Script]] は[[符号点]]の[[用字系]]を1つ指定するものです。

;; [8] 具体的な[[用字系]]の他に、 [CODE[Common][Common (UCD)]]
など特別な値もあります。
[SEE[ [[Unicode用字系特性値]] ]]

[9] [[UCD]] の [DFN[[CODE[Scripts.txt]]]] [SRC[>>10]]
に記述されています。 [SRC[>>7]]
[[UCD]] の一般的なファイル形式を採用しています。
明示されていないときの既定値は [CODE[Unknown]] です [SRC[>>37]]。

* [CODE[Script_Extensions]] 特性

[25] 
[DFN[[CODE[Script_Extensions]]]]
([[別名]]: [DFN[[CODE[scx]]]])
は、
[[Unicode用字系特性値]]の[[集合]]を値とする[[特性]]です [SRC[>>23]]。

[27] 
[CODE[Script_Extensions]] は[[符号点]]の[[用字系]]を1つ'''[[以上]]'''指定するものです。
[CODE[Script]] 
は1つの[[用字系]]しか記述できないため、
複数の[[用字系]]で使われるものは 
[CODE[Common]] や [CODE[Inherited]]
とされるか、
取捨選択されています。
[CODE[Script_Extensions]] では複数を記述できます。

[28] 
[CODE[Script_Extensions]] は次の要件を満たします。 [SRC[>>23]]

- [29] A., B. [[符号点]]の [DFN[[F[scx[RUBYB[[RUBY[集][しゅう]][RUBY[合][ごう]]][set]]][scx set]]]]は、
1つ[[以上]]の[[Unicode用字系特性値]]の順序のない[[集合]]です。
- [31] C. [[scx集合]]は、
1つの暗示値か、
1つ[[以上]]の明示値を含みます。
- [32] D. [[符号点]]の [CODE[Script]] が[[明示値]]なら、
[F[scx集合]]はその値を含みます。


[30] 
[[符号点]]の [CODE[Script]] が [CODE[Unknown]] なら、
[F[scx集合]]は { [CODE[Unknown]] } です。
[SRC[>>23]]

[33] 
[[符号点]]の [CODE[Script]] が [CODE[Inherited]] や [CODE[Common]] のときは、
2通りがあります。
[F[scx集合]]も { [CODE[Inherited]] } や { [CODE[Common]] } となることと、
明示値 (具体的な[[用字系]]) が1つ[[以上]]含まれた[[集合]]となることがあります。

[EG[
[34] 例えば [CODE(charname)@en[SPACE]] ([CODE[Script]] = [CODE[Common]])
の[F[scx集合]]は { [CODE[Common]] } です。
[[ー]] ([[長音記号]]) の[F[scx集合]]は
{ [CODE[Hiragana]], [CODE[Katakana]] }
です。
]EG]

[35] 
[[符号点]]の [CODE[Script]] が明示値なら、 [F[scx集合]]にその値が含まれます。
加えてその他の明示値が含まれることもあります。

[42] [[UCD]] の [DFN[[CODE[ScriptExtensions.txt]]]] [SRC[>>41]]
に記述されています。 [SRC[>>37]]
[[UCD]] の一般的なファイル形式を採用しています。
値は[F[scx集合]]に含まれる値を[[空白]]区切りで並べたものとなっています
[SRC[>>37]]。
明示されていないときの既定値は [CODE[Script]] の値です [SRC[>>37]]。


* 仕様上の特性値の決定


[12] 
[CODE[Script]] 特性値は次のような基準で決められています。
[SRC[>>11]]

- [13] [[文字]]が特定の[[用字系]]でのみ、または主に特定の[[用字系]]で使われるなら、
その[[用字系]]。
-- [14] 例えば[[アラビア文字]]としても、
関係するマイナーな[[用字系]]や歴史的な[[用字系]]でも使われるような[[文字]]は、
わざわざ [CODE[Common]] にせずに便宜上[[アラビア文字]]扱いにします。
-- [18] 例えば[[ラテン文字]]を[[漢字]]中で使うとしても、
「[RUBYB[普通に使う][regular use]]」
といえないレベルならわざわざ [CODE[Common]]
にせず[[ラテン文字]]とします。
- [15] 複数の[[用字系]]で使われる [CODE[Mn]] や [CODE[Me]]
などは、 
[CODE[Inherited]]
とします。
- [16] 複数の[[用字系]]で使われるその他の[[文字]]は、
[CODE[Common]] とします。
- [17] 
[[未割当符号点]]、[[私用文字]]、[[非文字]]、[[サロゲート符号点]]は、
[CODE[Unknown]] とします。


[22] 
[[丸付き文字]]や[[組み文字]]などは、
大部分が [CODE[Common]]
ですが、
一部が[[片仮名]]や[[ハングル]]になっているなど、
扱いが一貫していません。
[SRC[>>7]]

;; [24] 
「㍻」や「⒜」が [CODE[Common]] なのに
「㋐」や「㌀」が [CODE[Katakana]] です [SRC[>>7]]
が、合理的理由があるようには思えません。
[CODE[Script]] の値は固定ではなく変えることができる (>>21)
と説明されているにも関わらず、
今更変えるのも実装上如何なものか [SRC[>>7]]
と放置されているようです。
(今現在雑な値が設定されている (ということは有効に活用されているとは思えない) 
ものを変えることにどんな不利益があるのか謎ですが...)

-*-*-

[36] 
[CODE[Script_Extensions]] 特性値は次のような基準で決められています。
[SRC[>>23]]

- [38] [CODE[Script]] が [CODE[Inherited]] か [CODE[Common]] で、
およそどの[[用字系]]でも使われ得るものなら、
{ [CODE[Inherited]] } か { [CODE[Common]] } 
です。
- [39] 特定少数の[[用字系]]で使われるものなら、
その[[用字系]]の[[集合]]です。
- [40] その他の場合は { [VAR[[CODE[Script]] の値]] } です。


-*-*-

[5] 
[[数式]]中の[[記号]]等、
各[[文字]]の一般的な用法から転じて特殊に使われるものは、
[[文字]]の
[CODE[Script]]
や
[CODE[Script_Extensions]]
の決定で考慮しないとされています。
[SRC[>>4, >>23]]

[6] 
そのため[[用字系]]に基づく処理では、用途によっては、
[[文字]]から決まる値と違う処理が必要になることがあります。
[SRC[>>4]]


* 安定性

[19] 
[CODE[Script]] や
[CODE[Script_Extensions]]
の値は変更されることがあります。 [SRC[>>11, >>23]]

[20] 
[[未割当符号点]]に新しい[[文字]]が追加されると、適切な[[用字系]]に設定されます。

[21] 
既存の[[符号点]]でも[[文字]]の用法の情報が集まり、他の[[用字系]]で使われるとわかれば、
適宜変更されます。
[SRC[>>11, >>23]]

* 正規表現

[45] 
[[Unicode正規表現]]の [CODE[\p]] では、
[CODE[Script]] や [CODE[Script_Extensions]] も使うことができます。
[SEE[ [[\p]] ]]

[46] 
[CODE[Script]] や [CODE[Script_Extensions]]
は、特例で簡略的な構文が使えることがあります。
[SEE[ [[\p]] ]]
(それだけ需要が大きなものと認識されているようです。)

[47] 
[[Unicode]] 側の説明によると、
[CODE[Script]] よりも [CODE[Script_Extensions]]
を使ったほうが、
[CODE[Common]]
や
[CODE[Inherited]]
が適切な[[用字系]]になっていて便利で、
例えば「ー」 ([[長音記号]]) で違いが生じます。
[SRC[>>43, >>44]]

[48] 
[[Perl]] も [CODE[Script_Extensions]] が [CODE[Script]] の改良版なのだから、
新しいコードは [CODE[Script_Extensions]] を使うのが良かろうとしています。
[SRC[>>79]]

[49] 
そしてあろうことか、 [[Perl]] 5.26 から、それまでの [CODE[Script]]
にかえて [CODE[Script_Extensions]] が省略構文 [SEE[ [[\p]] ]]
で使えるようになりました。[SRC[>>79]]

[50] 
これは[[非互換変更]]で、旧来 [CODE[\p{[[Hiragana]]}]] は
[CODE[\p{sc=[[Hiragana]]}]] の意味だったところ、
現行版では 
[CODE[\p{scx=[[Hiragana]]}]]
の意味に強制的に置き換わってしまっています。

[51] 
確かに [CODE[\p{sc=[[Katakana]]}]] だと「ー」 ([[長音記号]]) 
が一致しないという不都合があるので、その点だけ見れば
[CODE[\p{scx=[[Katakana]]}]]
は改善にみえます。
が、違いはそれだけではありません。

[52] 
例えば、文字列

>
アー﹅イ〓〃〝ウ「・」、エ【。】オ

は、
[[正規表現]] [CODE[/^\p{scx=[[Katakana]]}+$/]]
に一致します。これは直感からかけ離れた結果ではないでしょうか?
どうやら、
[[日本語]]文中に登場しそうな[[句読点]]や[[記号]]のうち、
[[欧米]]であまり使わなそうなものは、
ことごとく [CODE[Script_Extensions]]
で[[平仮名]]や[[片仮名]]扱いになっているようです。

[53] 
[CODE[Script_Extensions]] 
だけではなく実は
[CODE[Script]]
も若干怪しいところがあります。
[CODE[Script]] [CODE[Katakana]] 
には、
「㌀」や「㋐」
のようなものも含まれています。
「㌀」は微妙ですが、
「㋐」は[[片仮名]]として文中で使われることはまずなく、
[[箇条書き]]などの[[記号]]に分類するのが適当ではないでしょうか。

[54] 
つまり、
「[[読み仮名]]入力欄がすべて[[平仮名]]で書かれているか確認する」
「文中から[[カタカナ語]]を抜き出す」
のような用途には
[CODE[Script]]
も
[CODE[Script_Extensions]]
も使いにくそうです。

;; [56] 「平仮名である」「片仮名である」のような一般の[[日本人]]の直感に合いそうな条件は
[[UCD]] にはなさそうです。
ということは[[正規表現]]でそうした条件を書きたければ、
面倒ですがいちいち[[文字クラス]]で列挙するくらいしか方法がありません。

[55] 
そのような典型的な用途に使えないとすると、
[CODE[Script]]
や
[CODE[Script_Extensions]]
はどんなときに使えばいいのでしょうかね?

[57] [CITE@ja[Perlで\p{Hiragana}とかが記号にマッチする問題 - Qiita]], [TIME[2023-08-19T15:53:29.000Z]] <https://qiita.com/takeda25/items/9e2a267978d43233bcb5>

* 処理

[SEE[ [[Unicode用字系特性値]] ]]

* メモ
