<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[2]</anchor-end> <dfn><rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">互換性等価性<rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">compatibility equivalence</rt></rubyb></dfn>は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">正準等価性</anchor>に加え、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">全角</anchor>・<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">半角</anchor>、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">上付き</anchor>、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">書体</anchor>などの差異も無視した<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">等価性</anchor>です。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">互換等価性</anchor>を保ちつつできるだけ基本的な<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">基底文字</anchor>と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">結合文字</anchor>の列に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">分解</anchor>する操作を<dfn><rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><anchor>互換分解</anchor><rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">compatibility decomposition</rt></rubyb></dfn>といいます。</p><section><h1>仕様書</h1><refs xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><ul xmlns="http://www.w3.org/1999/xhtml"><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="5" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[5]</anchor-end> <cite xml:lang="en-us">UAX #44: Unicode Character Database</cite> (<time>2013-09-27 22:15:15 +09:00</time> 版) <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://www.unicode.org/reports/tr44/#Character_Decomposition_Mappings">http://www.unicode.org/reports/tr44/#Character_Decomposition_Mappings</anchor-external></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="7" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[7]</anchor-end> 
<cite xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RFC 7564</anchor> - PRECIS Framework: Preparation, Enforcement, and Comparison of Internationalized Strings in Application Protocols</cite>, <time>2024-07-07T03:59:22.000Z</time> <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://datatracker.ietf.org/doc/html/rfc7564#section-9.17">https://datatracker.ietf.org/doc/html/rfc7564#section-9.17</anchor-external></li></ul></refs></section><section><h1>文字カテゴリー <code>HasCompat</code> (PRECIS)</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="8" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[8]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PRECIS</anchor>
の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字カテゴリー</anchor>
<dfn><code>HasCompat</code></dfn>
は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">互換性等価性</anchor>を持つ<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>を表します。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="7" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;7</anchor-internal></src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="9" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[9]</anchor-end> 
<code>HasCompat</code>
は、
<code>toNFKC</code> を適用すると異なる値となる<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号位置</anchor>と定義されています。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="7" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;7</anchor-internal></src></p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="10" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[10]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IDNA2008</anchor> は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unstable</anchor> で <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">case folding</anchor> 
と組み合わせた定義を使っています。</comment-p></section><section><h1>互換分解の破壊性</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="11" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[11]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode正規化</anchor>は破壊的です。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>を異なる意味の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>に不可逆的に変換する操作です。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">互換分解</anchor>は
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode正規化</anchor>の破壊性の主要な発生源です。
従って、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">利用者入力</anchor>など事前にその性質を確定できない<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>に適用してはなりません。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>Unicode正規化</anchor> </sw-see></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="4" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[4]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">正準等価性</anchor>に対しては<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">正準分解</anchor>と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">正準結合</anchor>がありますが、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">互換性等価性</anchor>に対しては<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">互換分解</anchor>しかありません。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">互換分解</anchor>によって失われる情報はいかなる意味でも後から復元できないからです。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[6]</anchor-end> 
<code>Vertical_Orientation</code>
が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">半角文字</anchor>と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">全角文字</anchor>で全然違っています。
そのため<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">互換分解</anchor>すると<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">縦書き</anchor>での表示方法の情報も失われてしまいます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1]</anchor-end>
<code class="charname" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HIRAGANA DIGRAPH YORI</anchor></code> を <q>より</q> にするような<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">分解</anchor>はやりすぎではないか?
<q>麿</q>を<q>麻呂</q>に分解するのと何が違う?</p></section><section><h1>互換分解の不完全性</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="12" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[12]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">互換分解</anchor>は必ずしも一貫した形で定められていません。
同じような構造の文字であるにも関わらず、あるものには<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">互換分解</anchor>があり、
あるものには<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">互換分解</anchor>がない、ということがあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="16" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[16]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">上付き</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ラテン文字</anchor>が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">結合文字</anchor>になっているようなケースには基本的に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">互換分解</anchor>が定められていないようです。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">結合文字</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">互換分解</anchor>というものがあまり想定されていないのでしょうか。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="17" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[17]</anchor-end> 
比較的新しく追加された<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>には<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">互換分解</anchor>が定められていないことが多いようです。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">互換分解</anchor>で表されるような<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>は新規追加しづらい風潮がありそうで (追加しないとはっきり決まっているのかまでは不明)、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> 開発初期だったら<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">互換分解</anchor>付きになっていそうなものでも、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">互換分解</anchor>されるような<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>ではなく独立した新規の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>として必要なものだという理由付けと共に提案されがちなのかもしれません。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="13" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[13]</anchor-end> 
従って何らかの用途に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">互換分解</anchor>が便利そうに見えても、
本当にそれで適切かは慎重に検討が必要です。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="15" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[15]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">互換分解</anchor>の結果の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>中に更に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">正準分解</anchor>できる<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>が含まれることがあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="14" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[14]</anchor-end> 関連:
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">丸付き文字</anchor>,
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">〒</anchor>,
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">発音区別符付き仮名</anchor></p></section><section><h1>関連</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="3" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[3]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">互換分解</anchor>は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">NFKC</anchor> と <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">NFKD</anchor> で使われています。</p></section><section><h1>メモ</h1></section></body></html>