YUKIの質問

私が、疑問に思ったことを書いております。ぜひヒントをください。


Unicodeって簡単

『Unicodeって一文字が、2Byteだから簡単だよね。』私も最初はこの言葉を信じていました。 確かに、内部コードにUnicodeを使ったプログラムはたくさん書きました。 Windowsには、便利なAPI(MultiByteToWideChar等)があり、変換も簡単です。 何が難しいのでしょう?しかし、私には、理解できない仕様が多いのです。 (英語が分からないのが、悪いのでしょう...)

そのため、公開しているプログラムも、 この様な、中途半端な理解を基に作られた怪しげなプログラムです。 そんなわけで、もう何年も使ってるプログラムですが、未完成です。 そこで、他人に使ってもらえば、私の知らない問題について教えてもらえるかと、思い公開してみました。 (誰か教えてください。バグがあったらお気軽に連絡してください。すぐに直せるかは、わかりませんが...)

Unicodeを使うようになった訳

Windowsでは、 MBCS(マルチバイト文字セット)の操作に関しても、 便利な、仕組みを準備してくれています。 たとえば、一文字先の文字にポインタをインクリメントしたい場合は、 SBCS(シングルバイト文字セット)時は、 str++;と何も考えずに行いますが、 MBCSも考慮する場合は、 str = _mbsinc(str);とするだけで対応できます。 この仕組みは、その他の言語圏にも対応できます。

しかし、何が気に入らないのか?これで良いではないか?確かにその通りです。 気に入らないのは、文字列を扱う場合に、いつも先頭から順番に手繰らないといけない点です。 ほかに、理由を探すと、半角カナと言われる文字(最近やたらと使うなと言われる)の使用頻度が減ったため、 シフトJIS(CP932)は、メリットが少ないと思います。 さらには、プロポーショナルフォントが全盛の今、半角の二倍の大きさが全角、 この定義が既に意味が無くなっていると思います。 色々考えた結果、要するに、嫌いなのです。 『Unicode を使うと、Windows NT 対応のアプリケーションの効率がよくなります。』、 『Windows NT では Unicode を使っています。』の甘い誘いもあり、Windows NT3.5からは、 私も、内部コードは、Unicodeにすることにしたのでした。 しかし、未だに#define _UNICODE;は、出来ない中途半端な、私です。

具体的な疑問

BYTE ORDER MARKとZERO WIDTH NO-BREAK SPACE

"BYTE ORDER MARK"とは、その通りに理解して、バイトオーダを示すマークのはずです。 "ZERO WIDTH NO-BREAK SPACE"とは、その通りに理解して、幅のない、 区切り文字でない文字(見えない、作用しない)文字となるはずです。 この二つの呼び名を持つU+FEFFは、いったい何なのでしょう? 私には、うまく説明が出来ません。

『JIS X 0221-1995 (ISO/IEC 10646-1:1993)付属書F(参考) UCSを識別するための“印”(しるし)の使用』を読んだときは、 『簡単に無視できるように設計されている。』の部分から、無視して良いと 思ったのですが、『データを受信する業務』とは、何のことでしょう? 『データを受信する業務』では、文字のストリームの先頭にある場合には 少なくともU+FEFFは、"BYTE ORDER MARK"として意味を持つようです。

U+FEFFは、無視して良いのか? 確かに、『簡単に無視できるように設計されている。』とは書いているのですが、 消しても良いとは、言ってないようです。

ではU+FEFFを、私はどう扱っているかは単に、"BYTE ORDER MARK"としてのみ利用しています。 後のU+FEFFは、無視しています。読み込み時に捨てています。これが一番簡単です。 Windowsもこんな感じの処理を期待していると思います。(勝手に思うなって?) その根拠は、"ZERO WIDTH NO-BREAK SPACE"をTextOut()すると、 幅があります。これはFontの問題なのかなぁ?こんな訳で、"ZERO WIDTH NO-BREAK SPACE"は、 Windowsでは、消しておいた方が都合がいいのです。 しかし、これでほんとに良いのか?悩みは深まるばかりです。 確かに、『簡単に無視できるように設計されている。』とは書いているのですが、 消去しても良いとは、言ってないようです。

COMBINING CHARACTER

結合文字これは、今まで考えていなかった問題です。 よく考える必要がありそうです。 たとえば、「か゛」(濁点は、U+3099)と、「が」は同じ扱いをしなければならないようです。 "LATIN CAPITAL LETTER A" + "COMBINING TILDE" と "LATIN CAPITAL LETTER A WITH TILDE"は、 同じらしいです。比較を行っても、等価である必要が有るようです。 すると、"SAPCE" + "COMBINING TILDE" = "TILDE"は成り立つのでしょうか? さらに、"ZERO WIDTH NO-BREAK SPACE"が間に入ったら、`COMBINING CHARACTER'は、 どんな合成を行うのでしょう?謎です。 何処が、一文字が、2Byte何だ?と思っていまいますよね。 これは、"surrogate pair"が出来た時点で、終わっていますが...

今は`COMBINING CHARACTER'を、どう扱っているか? それは、表示系がないから考えていません。日本には、今まで考えなくて良かった問題ですので... (えっ?JIS X0208-1990にあった"COMBINING ENCLOSING CIRCLE"は?それは...もう時効でしょう)

おわりに

どっちにしても、わからないことだらけです。 私は、Unicodeを知らないと言って、間違い有りません。 まだ、わからないことさえも、わからない問題があるように思えます。 誰か、教えてください。(自分で考えろって、はい...)


Copyright (C) 1999 YUKI.