訂正 #5

妨害 (block)

[5] ある文字開始子との関係で妨害されている (blocked) とは、 両者の間に他の基底文字やより結合クラスの小さな結合文字が挟まっているために、 両者を正準結合できないことをいいます。

定義

[1]

開始子 S で始まる文字列において、 S と文字 C の間に文字 B があって、 B が開始子であるか、 または BC同じ以上結合クラスを有するとき、 この場合に限って、 CS から妨害されている (blocked) 。 (<http://www.unicode.org/reports/tr15/#D2>)

訂正 #5

[3] Unicode 3.0.0 から Unicode 4.0.1 までは >>1 の定義において 「BC同じ結合クラスを有する」とされていましたが、これでは問題があることが分かり、 訂正 (Corrigendum) #5 で「BC 以上結合クラスを有する >>6」 に改められています。 Unicode 4.1.0 以後これが反映されています。

[10] この定義の誤りにより、正規化形 (NFC など) は何度適用しても結果が変わらないはずでしたが、 実際には2度適用すると結果が変わってしまうことがありました。 Unicode Consortium はごくごく例外的なケースであって、現実的には存在しない文字列 >>8>>9 11.2 でのみ発生していたとしています。

[11] Unicode 4.1 以降は強い正規化安定性が保証されることになっていますが、 4.1 に先立って行われたこの修正の前後では強い正規化安定性は成立していません。 また、それ以前から保証される弱い正規化安定性も結果的に成立していないと言えるかもしれません。 (もっとも、非互換変更が原因ではなく、 同じ版であっても正規化済みの文字列を更に正規化できてしまうという不具合なのですが。)

[12] この訂正以前の実装においては、 UAX #15 に厳密に従っていて同様に問題を孕んでいるものと、 (偶然か必然か) 訂正後の仕様と同等の動作をするもののどちらもあったようです >>9 11.3

[13] この訂正の影響を受ける文字列については >>9 に示されています。

メモ

[2] BC を妨害している場合には、 そのままなら正準結合できても、 BC の順序を入れ替えると正準結合できなくなることがあります。

結合文字列が正準順序で並んでいるときには、 ある文字が妨害されているかどうかの検査は直前の文字を見るだけで行えます。