sc

Script, Script_Extensions (UCD)

[2] UnicodeUCD特性 Script, Script_Extensions は、 文字 (Unicode符号点) の用字系を表すものです。

仕様書

Script 特性

[3] Script (別名: sc) はカタログ型の特性です >>7特性値Unicode用字系特性値です。

[26] Script符号点用字系を1つ指定するものです。

[8] 具体的な用字系の他に、 Common など特別な値もあります。 Unicode用字系特性値

[9] UCDScripts.txt >>10 に記述されています。 >>7 UCD の一般的なファイル形式を採用しています。 明示されていないときの既定値は Unknown です >>37

Script_Extensions 特性

[25] Script_Extensions (別名: scx) は、 Unicode用字系特性値集合を値とする特性です >>23

[27] Script_Extensions符号点用字系を1つ以上指定するものです。 Script は1つの用字系しか記述できないため、 複数の用字系で使われるものは CommonInherited とされるか、 取捨選択されています。 Script_Extensions では複数を記述できます。

[28] Script_Extensions は次の要件を満たします。 >>23

[30] 符号点ScriptUnknown なら、 scx集合は { Unknown } です。 >>23

[33] 符号点ScriptInheritedCommon のときは、 2通りがあります。 scx集合も { Inherited } や { Common } となることと、 明示値 (具体的な用字系) が1つ以上含まれた集合となることがあります。

[34] 例えば SPACE (Script = Common) のscx集合は { Common } です。 (長音記号) のscx集合は { Hiragana, Katakana } です。

[35] 符号点Script が明示値なら、 scx集合にその値が含まれます。 加えてその他の明示値が含まれることもあります。

[42] UCDScriptExtensions.txt >>41 に記述されています。 >>37 UCD の一般的なファイル形式を採用しています。 値はscx集合に含まれる値を空白区切りで並べたものとなっています >>37。 明示されていないときの既定値は Script の値です >>37

仕様上の特性値の決定

[12] Script 特性値は次のような基準で決められています。 >>11

[22] 丸付き文字組み文字などは、 大部分が Common ですが、 一部が片仮名ハングルになっているなど、 扱いが一貫していません。 >>7

[24] 「㍻」や「⒜」が Common なのに 「㋐」や「㌀」が Katakana です >>7 が、合理的理由があるようには思えません。 Script の値は固定ではなく変えることができる (>>21) と説明されているにも関わらず、 今更変えるのも実装上如何なものか >>7 と放置されているようです。 (今現在雑な値が設定されている (ということは有効に活用されているとは思えない) ものを変えることにどんな不利益があるのか謎ですが...)

[36] Script_Extensions 特性値は次のような基準で決められています。 >>23


[5] 数式中の記号等、 各文字の一般的な用法から転じて特殊に使われるものは、 文字ScriptScript_Extensions の決定で考慮しないとされています。 >>4, >>23

[6] そのため用字系に基づく処理では、用途によっては、 文字から決まる値と違う処理が必要になることがあります。 >>4

安定性

[19] ScriptScript_Extensions の値は変更されることがあります。 >>11, >>23

[20] 未割当符号点に新しい文字が追加されると、適切な用字系に設定されます。

[21] 既存の符号点でも文字の用法の情報が集まり、他の用字系で使われるとわかれば、 適宜変更されます。 >>11, >>23

正規表現

[45] Unicode正規表現\p では、 ScriptScript_Extensions も使うことができます。 \p

[46] ScriptScript_Extensions は、特例で簡略的な構文が使えることがあります。 \p (それだけ需要が大きなものと認識されているようです。)

[47] Unicode 側の説明によると、 Script よりも Script_Extensions を使ったほうが、 CommonInherited が適切な用字系になっていて便利で、 例えば「ー」 (長音記号) で違いが生じます。 >>43, >>44

[48] PerlScript_ExtensionsScript の改良版なのだから、 新しいコードは Script_Extensions を使うのが良かろうとしています。 >>79

[49] そしてあろうことか、 Perl 5.26 から、それまでの Script にかえて Script_Extensions が省略構文 \p で使えるようになりました。>>79

[50] これは非互換変更で、旧来 \p{Hiragana}\p{sc=Hiragana} の意味だったところ、 現行版では \p{scx=Hiragana} の意味に強制的に置き換わってしまっています。

[51] 確かに \p{sc=Katakana} だと「ー」 (長音記号) が一致しないという不都合があるので、その点だけ見れば \p{scx=Katakana} は改善にみえます。 が、違いはそれだけではありません。

[52] 例えば、文字列

アー﹅イ〓〃〝ウ「・」、エ【。】オ

は、 正規表現 /^\p{scx=Katakana}+$/ に一致します。これは直感からかけ離れた結果ではないでしょうか? どうやら、 日本語文中に登場しそうな句読点記号のうち、 欧米であまり使わなそうなものは、 ことごとく Script_Extensions平仮名片仮名扱いになっているようです。

[53] Script_Extensions だけではなく実は Script も若干怪しいところがあります。 Script Katakana には、 「㌀」や「㋐」 のようなものも含まれています。 「㌀」は微妙ですが、 「㋐」は片仮名として文中で使われることはまずなく、 箇条書きなどの記号に分類するのが適当ではないでしょうか。

[54] つまり、 「読み仮名入力欄がすべて平仮名で書かれているか確認する」 「文中からカタカナ語を抜き出す」 のような用途には ScriptScript_Extensions も使いにくそうです。

[56] 「平仮名である」「片仮名である」のような一般の日本人の直感に合いそうな条件は UCD にはなさそうです。 ということは正規表現でそうした条件を書きたければ、 面倒ですがいちいち文字クラスで列挙するくらいしか方法がありません。

[55] そのような典型的な用途に使えないとすると、 ScriptScript_Extensions はどんなときに使えばいいのでしょうかね?

[57] Perlで\p{Hiragana}とかが記号にマッチする問題 - Qiita, https://qiita.com/takeda25/items/9e2a267978d43233bcb5

処理

Unicode用字系特性値

メモ