結合文字が表示されません

  1. 結合文字が表示されません。
    いつ頃からは判りませんが、
    発生条件が以前のIVSのときと酷似しています。
    http://www.haijin-boys.com/50e943035700f3.90570036.html
    IVSも結合文字の一種だし、何か似たような処理入っていたりする?
    Mery ver 2.1.2.4548

     |  foo  |  返信
  2. ご報告ありがとうございます。
    こちらでも確認してみましたが、まだ再現できていません。

    > IVSも結合文字の一種だし、何か似たような処理入っていたりする?

    IVS 対応で確かにそのあたりの修正は行っていますので、問題ないとは言い切れない部分ですね。どのような文章が表示されないか例文など頂けませんでしょうか?

    例えば、↓ のようなウムラウトは表示できてます。フォントはメイリオです。

    ウムラウトüあああ

    ↓のような記号も行けています。(ブラウザだと表示できないかもですが)

    結合文字•̥̑.̮•̥̑ あああ

    発生条件が分かれば再現できると思いますので、お手数をお掛けしますがよろしくお願いします。

     |  Kuro  |  返信
  3. つって、結合文字一覧をググって自分で貼ってみろっていう話ですわな。
    ちょっと調べてみます。

     |  Kuro  |  返信
  4. なるほど、確認できました。

    1    横型結合文字     प्य    प + ् + य    pya
    2    縦型結合文字     ड्ड    ड + ् + ड    DDa
    3    独立結合文字     क्ष    क + ् + ष    k$a
    4    virama्付き結合文字     ड्‌ड    ड + ् + ड    DDa

    このあたりだと思います。
    IVS 対応関係なく、そもそも Mery 公開当時からこれ描画できなかったようですね。
    結合文字って文字幅ゼロで重ね合わせてエディタ側で描画するものだと思っていたのですが、そもそも根本的な思い違いをしていたのかもしれません。

    なかなか難易度が高そうですが、じっくり取り組んでみたいと思います。

     |  Kuro  |  返信
  5. 調べてみたところ、こりゃ詰んでますわ・・・。
    参りました。

    ある程度の結合文字には対応できていると思いますが、一部結合文字とみなされないようになっている部分があるようです。考えてみましたが、この修正には膨大な時間と労力がかかると思います。ただ、抜け道があって、楽して対応できそうな案もみつかったのですが、副作用の影響範囲が見えない状態です。

    すぐには修正できそうにありませんので、ご了承ください。もちろん修正しないわけではなく、時間がかかりそうというだけですが。

    ・・・当面、結合文字対応、という文面は削除しておこうと思います。

    IVS 以上に結合文字はやっかいでした。
    うむぅう・・・、困った。

     |  Kuro  |  返信
  6. 確認できたと言うことで必要ないかもしれませんが
    一応こちらで試したのは
    フォントはメイリオで試した文字は↓です
    かが
    「わざわざ結合文字を使うな」とか言われそうですが。

     |  foo  |  返信
  7. ご確認ありがとうございます。
    なるほど、意外とシンプルなところですね。

    > 「わざわざ結合文字を使うな」とか言われそうですが。

    あえて結合文字を使っているのがカッコイイですw

    さて本件、詳細に調査してみました。
    結論から申しますと、結合文字に正しく対応することは私の力では不可能でした。
    結合文字が結合する法則がびっくりするほどややこしいです。

    今回の例を元に調べてみましたところ、「か」に「゛」は結合できますが、「が」に「゛」は結合できないようです。こんな感じで、次に続く文字によって結合されるかどうかが変わったり、3 文字以上の場合でもその並び順によって結合されるかどうかが異なったり、さらにはフォントによって結合されるかどうかが違ったり、、、

    さらに外国語になると日本語でいうところの「か」と「が」のように、その国の言葉を熟知していないと結合できる文字かどうかを判断することができないような部分が存在するようです。

    そういうわけで結合文字にちゃんと対応するのは諦めて、今回の「か」と「゛」のような日本語の基本的なパターンはある程度対応するような方向で進めたいと思います。

     |  Kuro  |  返信
  8. > 今回の例を元に調べてみましたところ、「か」に「゛」は結合できますが、「が」に「゛」は結合できないようです。こんな感じで、次に続く文字によって結合されるかどうかが変わったり、3 文字以上の場合でもその並び順によって結合されるかどうかが異なったり、さらにはフォントによって結合されるかどうかが違ったり、、、

    これはもうユーザーを信じるしか方法はないのでは?
    間違った組み合わせは決して現れない。フォントもきちんと設定されている。
    間違った組み合わせに対する正しい表示方法なんて存在しないし。

     |  foo  |  返信
  9. 結合文字シーケンス

    「結合文字のすべてが表示できない」のではなくて、
    異体字シーケンスの最初の実装のときと同じ症状が
    あることを指摘しているのではないですか?

    一般的な外国語の合字や発音記号で使われる、
      //  アクセント記号 166 (\u02b0) ~ 245 (\u02ff) の範囲で80文字
      //  Spacing Modifier Letters

      //  合成記号 246 (\u0300) ~ 341 (\u036f) の範囲で112文字
      //  Combining Diacritical Marks
      //  これは結合文字、前の文字と1つに結合して表示
    はすべて表示できています。

    Macからやってくるファイル名などでは、かな表現が、
    濁点つきの「が」を分解した、基底文字の「か」と
    結合文字の濁点になっていることがあります。

    この

    が
    304B 3099

    を連続して使うとき、左隣の文字が基底文字と同じ
    で結合文字(濁点)無し、だとそれに影響を受けて
    結合文字ではなく、基底文字として表示されてしまう
    現象が発生します。
    この現象を修正してほしい、とおっしゃっているので
    はありませんか。

    かがががが
    がかががが
    ががかがが
    がががかが

    ががががが

    異体字シーケンスでは、この現象は修正されており、
    正しく表示できます。

    2B7EF E0101

     |  inuuik  |  返信
  10. こんばんは、書き込みありがとうございます。
    そうですね、ご報告いただいたのは IVS とときと同じ症状 (結合文字単体だと表示できているが、手前に別の文字が入ると表示できない) のご報告ですね。

    並列して調査しておりましたところ、一部の結合文字が表示できていなかったのでそっちの回答が長くなってしまいました。。。すみません。

    > 異体字シーケンスでは、この現象は修正されており、
    > 正しく表示できます。

    先日の回答の最後の方にちょろっと書いてますが、今回の事例 (ひらがな、カタカナの濁点など) は IVS の時と同じように対応する方向で修正しようと思います。

    内部的に描画のタイミングを計算するための分割点の対応表を持っていて、分断文字の場合はそこで文字を分断して描画するという仕組みなので、ひらがな、カタカナの場合は次に結合文字っぽいものがあるかどうかを判定して、もし結合文字があればそれらを分割しないで一括描画するといった、例外処理を組み込む形になります。

    まぁ、これ自体が良くないのかもしれませんが、色分けの都合で分割点を知る必要があるため、こうなってます。ひらがな、カタカナ、漢字、全角数字、全角記号、諸外国語、とか細かく色分けできるようになっていることが足を引っ張ってます。

    あれ、前にも同じ話で盛り上がった記憶が!?気のせいかもしれませんが。

    ある程度対応していく、と書きましたのは、日本語のひらがな、カタカナに対応できたとしてもそれ以外は保証できないためです。

    > 横型結合文字 प्य

    ↑ こんなやつとかですね。

    完全に対応するという話に傾いていたのでわずらわしかったかもしれません。すみませんでした。ちょいとやる気がありすぎて先走ってしまいました。

    普通に、「が」ね、治しときます~で良かったかもですね(汗

     |  Kuro  |  返信
  11. >先日の回答の最後の方にちょろっと書いてますが、今回の事例 (ひらがな、カタカナの濁点など) は IVS の時と同じように対応する方向で修正しようと思います。
    横ですが、DirectWriteかUniscribeを使えばそこら辺は比較的簡単に対応できます
    (ついでに右から左に表示する言語にも対応できます)
    ただ、DirectWriteを使う場合はVista以降でしか動かなくなるという欠点がありますが、
    IDWriteTextLayoutでシンタックスハイライトから隠し文字まですべて対応できます
    XPを切り捨てたくない場合はUniscribeを使うことになりますが、シンタックスハイライトを行う場合は低レベルAPIを使わないといけないので非常に手間がかかります

     |  結合文字について  |  返信
  12. 情報ありがとうございます。

    DirectWrite とか Uniscribe はまったく知りませんでした。
    GDI の後継規格のようで、これを使えばアンチエイリアスの綺麗な描画もできたりしそうですね、面白そう。秀○さんとか対応してるみたいですね、スゴス。(見た感じ、アンチエイリアスはあまり美しくなさそうでちょっと残念ですが・・・)

    > (ついでに右から左に表示する言語にも対応できます)

    どこまで自動でやってくれるのか分かりませんが、世界進出には必要な気がしますね。(今のところ世界は見てないですが)

    > IDWriteTextLayoutでシンタックスハイライトから隠し文字まですべて対応できます

    文字の装飾とかもできるようで、なんとも便利な API っぽいですね。目から鱗です。

    > XPを切り捨てたくない場合はUniscribeを使うことになりますが、シンタックスハイライトを行う場合は低レベルAPIを使わないといけないので非常に手間がかかります

    現在の Mery ではシンタックスハイライト、というか文字の色分けで文字の種類ごとに細かく分類して TextOut しているのでそれだけでも非常に手間がかかっている部分ではありますね。逆に、文字の種類ごとの色分けをしなければ TextOut でも結合文字はすんなり描画できたりしますけど・・・。

    しかし、テキストエディタエンジン自体は私が開発したものではないので、実装を変えるとなると鼻血じゃ済まないレベルでしょうね、、、

    貴重な情報ありがとうございます、ネタ帳にメモっときます。

     |  Kuro  |  返信