パスワードを忘れた? アカウント作成
552147 journal

umqの日記: バイト列に意味はあるのか(07)

日記 by umq

NFD や NFKD などの分解形の正規形式には、結合文字(combining character)が含まれることがあります。

The Unicode Standard 4.0 book の Chapter 3 Conformace(pdf) で、結合文字は

D14
Combining character: A character that graphically combines with a preceding base character. The combining character is said to apply to that base character.

と定義されています。

結合文字の扱いについては、現状ではアプリケーション実装者に多くが委ねられていると考えています。
というのは、例えば、結合文字があった場合にどのような表示にするかは厳密に決まっていないからです。

手許で常用している環境では、結合文字を使用した結果が表現可能(=対応するグリフが表示できるの)であれば、そういう表示がなされるようです。
# 逆に,対応する図形が表示できない場合は,適当に合成するので,たとえば COMBINING DOUBLE ACUTE ACCENT を仮名に合成したからといって,濁点に見えるのはレアケースだと思います。

例を、挙げます。

Diaeresis という記号があります。これは、分音符号ともよばれ、2つ連なった母音文字をそれぞれ発音する際に、後側の母音文字につけます。
例えば: naïve, noël などがそうです。

これらは、それぞれ、Unicode の符号列として表すと、NFD では U+006E U+0061 U+0069 U+0308 U+0076 U+0065, U+006E U+006F U+0065 U+0308 U+006C となり、NFC では、U+006E U+0061 U+00EF U+0076 U+0065, U+006E U+006F U+00EB U+006C となります。

ところで、最初の例の i に分音符号 ¨ をつけた文字は、字形としては点がふたつのものが通常のかたちになります。そこでアプリケーションとしては、分解形式でも合成形式でも同じように点がふたつのグリフ表示するのが望ましい形になります。
手許の Mac OS X 環境では、どちらの表記でも 2 点の図形が表示されました。

他の例をあげます。南米の地名に Saül というのがあります。この u に付く ¨ も tréma、つまり diaeresis ですが、この文字は u に変音記号 umlaut のついたものと見た目上区別がつきません。
そういう場合どうするか、ということについて、Unicode のドキュメントに記述があります。Combining Grapheme Joiner(CGJ: U+034F) という文字を挟んで区別するとよい、ということのようです。
この場合、正規形は NFC でも NFD でも U+0053 U+0061 U+0075 U+034F U+0308 U+036C になります。

とはいえ、CGJ を使った表記は比較的最近規定されたようで、まだまだ実装されている環境は少ないのではないかとおもいます。

[ひとつまえ]

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

計算機科学者とは、壊れていないものを修理する人々のことである

読み込み中...