◀ANSI版開発トップへ
  • 5031 エディタ部分テキストの文字コード管理について
    • 5032 (続き) エディタ部分テキストの文字コード管理について
    • 5033 Re:エディタ部分テキストの文字コード管理について
    • 5034 RE: エディタ部分テキストの文字コード管理について
      • 5035 RE2: エディタ部分テキストの文字コード管理について
        • 5037 Re3: エディタ部分テキストの文字コード管理について
          • 5040 Re4: エディタ部分テキストの文字コード管理について
            • 5041 Re5: エディタ部分テキストの文字コード管理について
              • 5042 Re6: エディタ部分テキストの文字コード管理について
                • 5043 Re7: エディタ部分テキストの文字コード管理について
                • 5044 Re7: エディタ部分テキストの文字コード管理について
                  • 5045 Re8: エディタ部分テキストの文字コード管理について
        • 5038 (続き) Re3: エディタ部分テキストの文字コード管理について
  • [5031] エディタ部分テキストの文字コード管理について kobake 2007年09月15日 10:47

    長文になってしまったので、先に要点だけ述べますと、
    やはりテキストデータの管理をwchar_tに絞って行いたいのですが、
    どうでしょうか、という意見を挙げさせていただきます。


    前のコメントで触れましたが、UNICODEビルドができるようになりました。
    ANSIビルド(ビルドが通るだけでなく、W系APIを使わないビルド)も通るようにするため、
    現在 TCHAR化を少しずつ進めています。
    エディタ部分を除くUI部分は、(時間はかかりますが)難はなさそうです。

    問題はエディタに関わるテキスト解析の部分で、
    コアとなる部分だけでも膨大な量である上に、
    プログラム言語の色分け機能のような、オプション的なテキスト解析系のコードも加わり、
    恐ろしいほどの手間と注意力が必要になりそうです。


    議論をぶり返して申し訳ないのですが、
    エディタ部分に関わるテキスト管理はwchar_tで行い、
    それに関するAPI呼び出しのときだけ、
    ビルドオプションに応じた文字コードに変換する、
    といった実装方法を提案したいのですが、どうでしょうか。

    要するに、必要最小限のAPI (TextOut系) をラップし、
    wchar_t を描画してるように見えるけど、内部ではANSIに変換してA系APIを呼び出す、
    といった形です。(または W系API をエミュレートするような関数を自作する?)
    unicows的な処理を自前でやる、という。

    実行時の負荷は増えてしまいますけど、コーディングの負荷は大幅に減らすことができます。
    これは今回のようなコアな箇所をいじるときの負荷だけではなく、
    今後、拡張機能を付けるときにも TCHAR を気にすることがなくなり、開発にとっつきやすくなると思います。
    可読性も増します。

    GetSizeOfCharのような関数を用いて、char, wchar_t 両者を同時対応することは、理想ではありますが、
    どうしても時間がかかります。両者対応しつつ、UNICODE化を進めるよりは、
    UNICODE化を完了した後で、charのデータ管理にも対応したコードに手直しする、といった流れのほうが、
    個人的には問題が発生しにくいと思います。

    (文字数制限があるようなので、次のコメントに続きます)
    • [5032] (続き) エディタ部分テキストの文字コード管理について kobake 2007年09月15日 10:48

      (続き)

      これはまだ自分の頭の中だけでしか検証していないプランなのですが、

        -- 現在の自分のコード --
        //ポインタを進める
        whcar_t* p;
        p++;
        //桁を進める
        int nX_Layout;
        nX_Layout+=W::GetKetaOfChar(*p); //今回のUNICODE化で自分が作成した関数です
        //文字比較
        if(*p==L'あ'){}

        ↓

        上で述べましたとおり、
        個人的にはここで本家に結合してもいいのではないか、と考えています。

        ↓

        -- 次段階 --
        //ポインタを進める
        WCharPointer p; //自前クラス
        p++; //自前演算子(内部実装は変わらない。余裕があればサロゲートペア対応)
        //桁を進める
        int nX_Layout;
        nX_Layout+=p.GetKeta(); //自前関数
        //文字比較
        if(*p==L'あ'){} //「*」は自前演算子

        ↓

        -- さらに次段階 (必要であれば) --
        //ポインタを進める
        TCharPointer p; //自前クラス(ビルド種により、自動切り替え)
        p++; //自前演算子
        //桁を進める
        int nX_Layout;
        nX_Layout+=p.GetKeta(); //自前関数
        //文字比較
        if(*p==_T('あ')){} //「*」は自前演算子

      というコーディングが頭に浮かんでいます。


      長文になってしまいましたが、一時的(または了解とパフォーマンスが得られれば永続的かも)に
      テキスト管理をwchar_tに絞りたい、というのが自分の伝えたい意見です。

      皆様のご意見よろしくお願い致します。
    • [5033] Re:エディタ部分テキストの文字コード管理について kobake 2007年09月15日 10:53

      補足ですが、ブランチ作成は
      UNICODEビルド、ANSIビルド、どちらも通るようになり、
      ソースコードの整理ができ、
      それに関するドキュメントを作成し終えたところで
      行いたいと考えています。

      その後のブランチの修正には、
      可能であれば皆様のご協力をお願いしたいです。
      まだ先のことですが、そのときはよろしくお願い致します。
    • [5034] RE: エディタ部分テキストの文字コード管理について げんた 2007年09月15日 12:06

      >議論をぶり返して申し訳ないのですが、
      >エディタ部分に関わるテキスト管理はwchar_tで行い、
      >それに関するAPI呼び出しのときだけ、
      >ビルドオプションに応じた文字コードに変換する、

      TCHARで進めると決まったときの経緯を再度考え直してみると,

      0. ANSI版は打ち止めにしてUNICODE版に切り替えるのはどうか?
      1. ANSI版の開発を継続すると,UNICODE版が使えるまでは両方を変更しなくてはならない
      2. UNICODE版に専念すると完成するまで全くリリースできません
      3. それがいつのことかわからないので未来永劫新バージョンは出ないかもしれない
      4. それはリスクが高すぎ.
      5. TCHARならコードが分岐することなく,少しずつ進められる.

      となったわけです.ですが,kobakeさんの登場によって1が可能になり,3のリスクも相当低くなったのであれば,UNICODEブランチを独立して進め,両者の機能が同等になったところでANSIはおしまいでも良いような気がしてきました.

      kobakeさんの案ですとANSI版は内部unicodeでメモリを2倍使い,表示の度にUNICODE<->ANSIの変換が動くことになり,メモリの少ないWin 95/98マシンで使っている人にとってみればUNICODEの割を食っただけで何も良いことがないと思いませんか.それにコードが大きく変わるのでANSI版も隅々まで動作確認が必要になりますが,これも割を食っただけ.
      そういう意味では先日commitしたVistaのマルチユーザ設定も同じですが.

      コードを分けることで文字コードに対するテンプレートを使わなくて済み,結果としてVC6でコンパイルできるコードが保たれるかも?

      もちろんTCHARを使っておくと後で変更を簡単に両方へ入れられる..というメリットがないほど手が入っていますかね...文字コードの特性に関わらないところ L""の代わりに_T("")と書いたり wchar_tの代わりにTCHARと書くだけで済む部分はそうしておいた方が良いとは思います.
      • [5035] RE2: エディタ部分テキストの文字コード管理について げんた 2007年09月15日 12:21

        無責任な言い方と思われるかもしれませんが,とりあえずはkobakeさんの考え方で進めていただいて,できてから後のことを考えればよいかなと思います.

        ANSIの人にメリットがないと書きましたが,それは使う人が決めればよいこと.それに,後から両立するためのうまいアイディアが出てくるかもしれない.
        • [5037] Re3: エディタ部分テキストの文字コード管理について kobake 2007年09月15日 13:13

          ▼ げんたさん(5035)
          > 無責任な言い方と思われるかもしれませんが,とりあえずはkobakeさんの考え方で進めていただいて,できてから後のことを考えればよいかなと思います.

          後押しありがとうございます。他の皆様のご意見もお聞きしたいです。

          >>dev:5035を拝見する前に>>dev:5034への返信を書いてしまっていたので、
          それもここに書いておきます。


          ▼ げんたさん(5034)
          > kobakeさんの案ですとANSI版は内部unicodeでメモリを2倍使い,表示の度にUNICODE<->ANSIの変換が動くことになり,メモリの少ないWin 95/98マシンで使っている人にとってみればUNICODEの割を食っただけで何も良いことがないと思いませんか.それにコードが大きく変わるのでANSI版も隅々まで動作確認が必要になりますが,これも割を食っただけ.

          おっしゃる通り、wchar_tにしてしまった時点では、
          ANSI版ユーザにとってメリットはひとつもありません。

          ただ、wchar_tにしたことで、今後の開発効率が上がるとしたら、
          (1バイト文字、2バイト文字を気にした、可読性もメンテナンスも大変なコードよりも
          wchar_tを用いたシンプルなコーディングは能率も上がるしバグも出にくい。
          もちろん、GetSizeOfCharのような関数を使って、マルチバイトの特性を意識しないように
          書かれている箇所は見受けられますが、それでも、まだマルチバイト依存のコードは
          多く残っています。。)
          今後の新しい機能をより早くバグの少ない状態で提供できることになります。
          それは、ユーザに、今後、パフォーマンスの代わりに、より多彩な機能を提供できるということです。

          そしてまた、
          wchar_tにしてしまった後の、再度のchar化は、
          charからwchar_tにするのに比べると、
          割とスムーズに行えるのでは、と自分は考えています。
          (自分が >>dev:5031 で書いた擬似コードのような流れで)

          wchar_t化することは、
          少なくとも、ANSI版を (重くはなるけど、動くという意味で)「捨てる」ことではありません。
          そして、自分が最も重要だと考えていることは、
          UNICODE版を「出来る限り早期に」本家トランクに結合させること、です。
          他の方が編集されているコードとのコンフリクト量を出来る限り小さく収めたいのです。
          そのためには、効率を上げるために、何かを捨てなければならず、
          「後で拾えるであろう」charを、今は捨ててしまうのはどうか、と提案したく思っております。


          (文字数制限のため、次のコメントへ続く)
          • [5040] Re4: エディタ部分テキストの文字コード管理について Uchi 2007年09月15日 22:22

            ▼ kobakeさん
            > ▼ げんたさん(5035)
            > > 無責任な言い方と思われるかもしれませんが,とりあえずはkobakeさんの考え方で進めていただいて,できてから後のことを考えればよいかなと思います.
            >
            > 後押しありがとうございます。他の皆様のご意見もお聞きしたいです。
            >
            SakuraはSjisのファイルを直接(未コード分やUnicodeに対する重複マッピング部も)扱えるほぼ唯一のエディタです。
            私がSakuraを使用している最大の理由のひとつです。
            単純に内部Unicode化をおこなった場合には、未コード分やUnicodeに対する重複マッピング部が壊れ、読み込んだファイルを書き出した場合、元と同じになりません。
            Unicode版は欲しいのですが(モカさんのUnicode版を2ndエディタとして使用しています)、この変更はやめてほしいです。
            よろしくお願いいたします。
            • [5041] Re5: エディタ部分テキストの文字コード管理について ラスティブ 2007年09月16日 00:11

              ▼ Uchi さん
              > SakuraはSjisのファイルを直接
              > (未コード分やUnicodeに対する重複マッピング部も)
              > 扱えるほぼ唯一のエディタです。

              ちょっと個人的にアンケートさせて下さい。
              SJIS のファイルを直接扱う必要性がある場面を、
              具体的に教えていただけますか・・・? (^^;
              • [5042] Re6: エディタ部分テキストの文字コード管理について Uchi 2007年09月16日 09:53

                ▼ ラスティブさん
                > ▼ Uchi さん
                > > SakuraはSjisのファイルを直接
                > > (未コード分やUnicodeに対する重複マッピング部も)
                > > 扱えるほぼ唯一のエディタです。
                >
                > ちょっと個人的にアンケートさせて下さい。
                > SJIS のファイルを直接扱う必要性がある場面を、
                > 具体的に教えていただけますか・・・? (^^;
                いろいろありますが、
                1. システム外字として、IBMの外字ではなく、NECの外字を使用しなければならないファイル。
                2. CP1252等のSJIS外のコードが入り混じったファイル。
                sjis部分だけの修正でしたのでそのままのコードが書き戻せればOKでした。
                3. exeファイル。
                すでにソースが無い状態で、メッセージだけを書き換えなければならない状態で。
                4. EBCDIC文字が混じったファイル。
                汎用機とのインターフェース用のファイルでありました。

                以上のような状況で重宝させていただきました。
                ほぼ過去とのしがらみなのですが。
                これからは、UTF-8等に移行等でこういった状況は減るとは思います。

                読み込んで、書き込むだけで内容が変更されるのは気持ちが悪いです。
                Unicode版でもバイナリの保存ができればいいのですが。
                • [5043] Re7: エディタ部分テキストの文字コード管理について ラスティブ 2007年09月16日 13:15

                  ▼ Uchiさん
                  > 1. システム外字として、IBMの外字ではなく、NECの外字を使用しなければならないファイル。
                  > 2. CP1252等のSJIS外のコードが入り混じったファイル。
                  > sjis部分だけの修正でしたのでそのままのコードが書き戻せればOKでした。
                  > 3. exeファイル。
                  > すでにソースが無い状態で、メッセージだけを書き換えなければならない状態で。
                  > 4. EBCDIC文字が混じったファイル。
                  > 汎用機とのインターフェース用のファイルでありました。

                  テキストを書けるバイナリエディタ「Thebe」を
                  お使い頂ければ、
                  恐らくその要件は満たされると思います・・・。
                  いかがでしょうか?

                  http://panathenaia.halfmoon.jp/thebe/

                  それに、どうもかなりの少数派の意見のようです。
                  その辺のことは・・・ちょっと微妙な状態です。
                • [5044] Re7: エディタ部分テキストの文字コード管理について kobake 2007年09月16日 13:37

                  ▼ Uchiさん
                  > > ちょっと個人的にアンケートさせて下さい。
                  > > SJIS のファイルを直接扱う必要性がある場面を、
                  > > 具体的に教えていただけますか・・・? (^^;
                  > いろいろありますが、
                  > 1. システム外字として、IBMの外字ではなく、NECの外字を使用しなければならないファイル。
                  > 2. CP1252等のSJIS外のコードが入り混じったファイル。
                  > sjis部分だけの修正でしたのでそのままのコードが書き戻せればOKでした。
                  > 3. exeファイル。
                  > すでにソースが無い状態で、メッセージだけを書き換えなければならない状態で。
                  > 4. EBCDIC文字が混じったファイル。
                  > 汎用機とのインターフェース用のファイルでありました。

                  なるほど、そういった使い方もあるのですね。盲点でした。
                  貴重な情報をありがとうございます。
                  内部コードのwchar_t化の影響として、動作パフォーマンス以外に失うものは無い、
                  と自分は思いこんでいましたが、たしかにこれは重要なリスクです。

                  ただ、自分のビジョンを述べさせていただきますと、
                  wchar_t管理にしてしまうことによる、開発サイドへの悪影響が生じるのであれば、
                  今すぐにでも作業方針を見直そうと考えていましたが、
                  逆に、(快適なANSI版を望む)ユーザの方々には、申し訳ありませんが、
                  開発サイドが安定するまで、少しの間お待ちいただきたいと考えている次第です。

                  UNICODE化したばかりの、サクラエディタでは、
                  それに付随するANSI版には、Uchiさんがおっしゃるような不具合(恐縮ですが、その時点での仕様とも言えます)が生じるはずです。
                  当然、そのような動作の差が生まれたとしたら、互換性を考え、現行のANSI版サクラエディタも公開したままにしておき、
                  ユーザがどちらを使うか選べる状態にしておきます (、、よね?>げんたさん、ラスティブさん)。

                  実装上の話になってしまい恐縮ですが、
                  >>dev:5037に書きました通り、内部wchar_t化した後の、再度のchar対応は
                  可能ではあります。
                  要望があるのであれば、先のことになってしまうと思いますが、
                  その作業を行い、新しいバージョンのサクラエディタでも
                  Uchiさんのおっしゃるような機能(つまり、現行のANSI版と互換性のある機能)を
                  提供できると思います。

                  ただ、数の暴力ととられるかもしれませんが、
                  時代を考えると、UNICODE版を主ターゲットとした開発がメインとなり、
                  ANSI版への細かい要望がなかなか反映されない、という状況が予感されるのも事実です。

                  そのときは、現在、Uchiさんが
                  現行のサクラエディタをメイン(?)に使い、モカさんのUNICODE版を2ndエディタとして使っていますように、
                  UNICODE版開発が主流になってしまった(場合の)未来には、
                  そのときから見れば古い(2007年現在の)ANSI版サクラエディタをメインに使っていただき、
                  新しいUNICODE版サクラエディタを2ndエディタとして使っていただくという選択肢を
                  提案させていただきたいと思うのですが、どうでしょうか。

                  と、書いてる間に
                  ラスティブさんからも「Thebe」というソフトがご紹介されていますね。
                  残念ですが、そういった別ソフトを使っていただく、
                  というのも選択肢としてお考えいただきたいです。

                  否定的な返答になってしまい、申し訳なく思っています。
                  ただ、Uchiさんがおっしゃるようなリスクがあることは念頭に置いておきます。
                  貴重なご意見ありがとうございました。
                  • [5045] Re8: エディタ部分テキストの文字コード管理について ラスティブ(代弁モード) 2007年09月17日 01:01

                    振られてしまいました・・・。

                     爆速 kobake さんの作業を滞りなく進められる環境を作り
                     まず物を完成させていただいた後、
                     どーしても必要があるところは、パッチを取り直す。
                     その後、状況を見計らって ANSI 版は開発終了? まぁ適当に。

                    こういった動きが強まっていますので、
                    爆速で仕上げにかかることが求められているようです(^^;

                    開発陣はこんな感じです。

                    以上です。
        • [5038] (続き) Re3: エディタ部分テキストの文字コード管理について kobake 2007年09月15日 13:14

          (上コメントからの続き)

          ▼ げんたさん(5034)
          > もちろんTCHARを使っておくと後で変更を簡単に両方へ入れられる..というメリットがないほど手が入っていますかね...文字コードの特性に関わらないところ L""の代わりに_T("")と書いたり wchar_tの代わりにTCHARと書くだけで済む部分はそうしておいた方が良いとは思います.

          ちょっと今の時点ではwchar_t決め打ちでコーディングしてしまった箇所が多い状態ではあります。
          ただ、これも「まずは動かすため」の暫定的に採った手段なので
          皆様のご意見をお聞きした上で、今後のソースコード整理の方針を考えていきたいです。

          エディタ関連のテキスト処理部分で L"" となってしまってる部分を
          単純に _T("") と書くことは、今の時点ではできませんが、
          代わりに、_T2("") のような書き方をするようにしておきます。(「_T2」という名前は仮です)

          (今の時点でできること)
          #define _T2 LTEXT //LTEXTはリテラルを強制的にL扱いにする、自作のマクロです

          (今後、管理コードがcharもサポートするようになったら、_T2の定義を変更)
          #define _T2 _T