none
Encoding.GetByteCount()による文字列のバイト数取得がうまくいかない RRS feed

  • 質問

  • いつも大変お世話になっています。

    開発環境:Win7 x86 Visual Studio 2013

    Unicode文字列で、全角を2バイト/半角を1バイトとした場合のバイト数を取得したいのですが、

    下記のコードを実行すると、len=15 がセットされます(len=16となって欲しい)。

    byte[] bytes = sjisEnc.GetBytes(str);

    で、中身をみると、

    82A0-3F3F-31-32-33-82A0-3F-82-A0-34-35-36

    となります。

    ”㐂”が”3F”に変換されるため、1バイト換算になっているようです。

    GetEncoding()に代わる良い方法はありますでしょうか。

    ご指導、よろしくお願いいたします。

    申し訳ありません。

    追加編集がよくわからず、乱雑になってしまいましたが、

    文末に、c++から使っているやり方も追記させていただきました。

    String str = "あ𠀋123あ㐂あ456"; Encoding sjisEnc = Encoding.GetEncoding("Shift_JIS"); int len = sjisEnc.GetByteCount(str);


        public static bool iskanji(char c)
        {
            return ((!((0x0020 <= (c)) && ((c) <= 0x007f))) && (!((0xff61 <= (c)) && ((c) <= 0xff9f))));
        }

        public static bool issurhigh(char c)
        {
            return ((0xD800 <= (c)) && ((c) <= 0xDBFF));
        }

        public static bool issurlow(char c)
        {
            return ((0xDC00 <= (c)) && ((c) <= 0xDFFF));
        }

        //	文字列調査 戻り値=半角文字列とした場合の文字数(バイト数) + それぞれの文字の配列位置を返す
        public static int GetCharInfo( String str, ref int[] info )
        {
        	int pos,i;
        	int cnt;
    
            for (i = 0, cnt = 0, pos = 0; i < str.Length; i++)
            {
    		    info[pos++]=i;
    		    if(iskanji(str[i])) {
    			    if((issurhigh(str[i]))&&issurlow(str[i+1]))	i++;
    			    cnt++;
    		    }
        		cnt++;
    	    }
        	info[pos]=i;
    	    return cnt;
        }
    

    kizakura_ui


    2015年11月25日 8:23

回答

  • 【追伸】

    半角 / 全角の定義が最初の話の通りでよければ、サロゲートの扱いに注意して以下のようにしてカウントできると思います。(もっとスマートは方法があるかもしれませんが)

    String unicodeString = "あ𠀋123あ㐂あ456";
    Console.WriteLine("Original unicode string: " + unicodeString);

    // 𠀋 はサロゲートなので 2 つの Char オブジェクトを使用。結果 unicodeString.Length は 12 になる。 Console.WriteLine(String.Format("Original unicode string length: {0}", unicodeString.Length)); Byte[] unicodeBytes = Encoding.Unicode.GetBytes(unicodeString); Console.WriteLine(); Console.WriteLine("Unicode Encoded bytes:"); foreach (Byte bt in unicodeBytes) { Console.Write("[{0:X}]", bt); } Console.WriteLine(); Console.WriteLine("Number of bytes: {0}", unicodeBytes.Length); for (int i = 0; i < unicodeString.Length; i++) { Char ch = unicodeString[i]; Console.Write(ch); if (Char.IsHighSurrogate(ch)) { Console.WriteLine(" :high surrogate => low surrogate と合わせて 2 バイト扱い"); } else if (Char.IsLowSurrogate(ch)) { Console.WriteLine(" :low surrogate => high surrogate と合わせて 2 バイト扱い"); } else if ((!((0x0020 <= (ch)) && ((ch) <= 0x007f))) && (!((0xff61 <= (ch)) && ((ch) <= 0xff9f)))) { Console.WriteLine(" :全角 => 2 バイト扱い"); } else { Console.WriteLine(" :半角 => 1 バイト扱い"); } }

    上のコードの実行結果は以下のようになります。

    Original unicode string: あ??123あ?あ456
    Original unicode string length: 12

    Unicode Encoded bytes:
    [42][30][40][D8][B][DC][31][0][32][0][33][0][42][30][2][34][42][30][34][0][35][0][36][0]
    Number of bytes: 24
    あ :全角 => 2 バイト扱い
    ? :high surrogate => low surrogate と合わせて 2 バイト扱い
    ? :low surrogate => high surrogate と合わせて 2 バイト扱い
    1 :半角 => 1 バイト扱い
    2 :半角 => 1 バイト扱い
    3 :半角 => 1 バイト扱い
    あ :全角 => 2 バイト扱い
    ? :全角 => 2 バイト扱い
    あ :全角 => 2 バイト扱い
    4 :半角 => 1 バイト扱い
    5 :半角 => 1 バイト扱い
    6 :半角 => 1 バイト扱い


    • 編集済み SurferOnWww 2015年11月26日 8:45 コード欠落部分追加
    • 回答としてマーク kizakura_ui 2015年11月26日 11:37
    2015年11月26日 8:42

すべての返信

  • それはもうバイト単位ではなくて幅単位ですね。

    で、まあ決定的なのはないんじゃないですかねぇ。フォント次第で半角で表示されるか全角で表示されるか異なる文字もあるでしょうし、Unicodeに含まれる文字の中には「表示しない文字」もありますし。

    2015年11月25日 8:30
  • > Unicode文字列で、全角を2バイト/半角を1バイトとした場合のバイト数を取得したいのですが、

    あなたの言う半角 / 全角の定義を具体的に(繰り返しますが「具体的」に)書いてください。

    2015年11月25日 8:54
  • ありがとうございます。

    c++からのやり方で、計算することにします。

    今後とも、よろしくお願いいたします。


    kizakura_ui

    2015年11月25日 9:19
  • 自作の関数では、全角の定義を下記のようにしています。

            public static bool iskanji(char c)
            {
                return ((!((0x0020 <= (c)) && ((c) <= 0x007f))) && (!((0xff61 <= (c)) && ((c) <= 0xff9f))));
            }

    よろしくお願いいたします。


    kizakura_ui

    2015年11月25日 9:21
  • よく分かりませんが、Shift_JIS の 2 バイトコードのことを全角と言っています? そうだとすると "𠀋" とか "㐂" は Shift_JIS の中には含まれていないようですけど。

    > ”㐂”が”3F”に変換されるため

    ”3F” は "?" ですよ。

    2015年11月25日 9:38
  • (UNICODE対応なら)、異体字セレクタがついてたときに、そのぶんの長さも引く必要が出てきませんかね。


    jzkey

    2015年11月25日 10:15
  • UNICODE文字の全角の範囲を

    (!((0x0020 <= (c)) && ((c) <= 0x007f))) && (!((0xff61 <= (c)) && ((c) <= 0xff9f)))

    このように定義して、今までは独自にバイト数の計算をしていました。

    先日ネットで、UNICODE文字列のバイト数の求め方、として下記のコードが載っていたので、

    Encoding sjisEnc = Encoding.GetEncoding("Shift_JIS");
    int len = sjisEnc.GetByteCount(str);

    これに切り替えたところ、従来と結果が違い・・・

    ”㐂”などもサロゲートペアだとばかり思っていました。

    ネットでのやり方は、あくまで、Shift_JIS変換が可能な文字列に限る、ということですね。

    いろいろお騒がせして申し訳ありませんでした。

    従来のやり方で計算することにします。

    ありがとうございました。


    kizakura_ui

    2015年11月25日 10:38
  • ”異体字セレクタ”という単語は知りませんでした。

    何かと考慮しないといけないんですね。

    SurferOnWwwさんへの返信の通り、

    実績のある従来のやり方で計算します。

    ありがとうございました。


    kizakura_ui

    2015年11月25日 10:42
  • あなたが言われている「従来のやり方」で良いとするならば、それは「文字のバイト数」ではありません。
    おそらくは「バイト表現」ではない、別の尺度のために計算しようとしているはずです。
    (ShiftJIS では表現できない文字が入力範囲に含まれるのに対して、ShiftJIS における文字定義範囲にある文字で 1 バイトで表現できる文字を選び取っているので、バイト数ではなく、自分の定義した文字集合に属するか否かを判断している)

    その尺度をきちんと説明された方がよりよい助言を得られると思います。
    (このスレッドでは何度か、そのことを指摘されています)

    2015年11月25日 13:12
    モデレータ
  • 質問者さんの言う「文字のバイト数」が何を表すか、質問者さん自身が理解されていないようですが、Hongliangさんが書かれているように「幅」を得たいということであれば、正式な方法を紹介しておきます。

    Unicode Standard Annex #11 EAST ASIAN WIDTHで定められていて、EastAsianWidth.txtに一覧情報があります。ここにFやWと書かれたものは全角幅、NaやHと書かれたものは半角幅、それ以外に幅の定まらないものもあります。

    仕様としてはこうなっていますが、これを補助するWindows APIは提供されていません。ですので、これをどう扱うかは状況次第です。

    2015年11月25日 14:11
  • ご指導、ありがとうございます。

    はい、以前にも度々お叱りを受け、「今後気をつけます。」と書きながら、

    また皆様に大変お手数をおかけし、申し訳ありませんでした。

    冒頭の質問、

    >>Unicode文字列で、全角を2バイト/半角を1バイトとした場合のバイト数を取得したいのですが・・・

    ここでは、「半角」以外の、サロゲートペアも含んだ漢字全般やひらがな等を全て「全角」と勝手に解釈して、質問していました。

    その解釈のまま、

    Encoding sjisEnc = Encoding.GetEncoding("Shift_JIS");
    int len = sjisEnc.GetByteCount(str);

    この方法で、求める結果を得られると勘違いしたことが間違いでした。

    申し訳ありませんでした。

    今後とも、よろしくお願いいたします。


    kizakura_ui

    2015年11月26日 0:01
  • ご指導、ありがとうございます。

    間違った解釈のまま質問をさせていただき、ご迷惑をおかけして申し訳ありませんでした。

    今後とも、よろしくお願いいたします。


    kizakura_ui

    2015年11月26日 0:04
  • おまけで、 Encoding.GetEncoding メソッドにはEncoderFallbackを受け取るオーバーロードが存在します。

    var sjisEnc = Encoding.GetEncoding("Shift_JIS", EncoderFallback.ExceptionFallback, DecoderFallback.ExceptionFallback);

    としていれば、?(0x3F)に変換されることなく、

    System.Text.EncoderFallbackException: Unable to translate Unicode character \u2000B at index 1 to specified code page.

    という例外が発生し、変換できない、つまりSurferOnWwwさんが指摘するようにShift-JISに含まれない文字が存在することをわかります。

    2015年11月26日 2:50
  • 今さらながらのレスですが・・・

    > ここでは、「半角」以外の、サロゲートペアも含んだ漢字全般やひらがな等を全て「全角」と勝手
    > に解釈して、質問していました。

    質問者さんの定義の (0x0020 <= (c)) && ((c) <= 0x007f) は:

    (0xff61 <= (c)) && ((c) <= 0xff9f) は:

     

    で、赤枠で囲った文字が「半角」、それ以外が「全角」ということになると思います。その定義で本当によろしいんですか? そのあたりから再考する必要がありそうな気がしますが。

    2015年11月26日 2:59
  • ありがとうございます。

    C++では、下記のret(LPBOOL ret)の値で判断していました。

     WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)source, -1, (LPSTR)dest, sizeof(dest), NULL, ret );

    C#での方法を教えていただけて助かりました。


    kizakura_ui

    2015年11月26日 4:00
  • お時間とっていただき、申し訳ありません。

    調べたところ、UNICODEにおける半角の範囲は、

    0x0 ~ 0x80, 0xf8f0, 0xff61 ~ 0xff9f, 0xf8f1 ~ 0xf8f3

    と書かれてありました。

    これが正解かどうかはわかりませんが、私の定義は不十分でした。

    ご指導、ありがとうございます。


    kizakura_ui

    2015年11月26日 4:19
  • 今までの内容からやりたいことを類推すると

    1.Unicode(おそらくUTF-16)でコードされた文字列の
     中の任意の1文字をShifJISに変換し、
     それがShifJISコード上の2Byte文字か、1Byte文字かを分類する

    の様に思えます。

    回答者の皆さんは明言していませんが、暗に
    「それがわかったとして、なにかできるのだろうか」という
    疑問があるのだと思われます。

    質問者さんは、この一般的には何の役にも立たない判定を
    何に使うのか説明したほうが良いかもしれません。
    自分も、この様な判定自体が本質的に不要である可能性が高いということを心配しています。
    いかがでしょう。

    ちなみに、文字の分類にはこんな関数群もあります。
    https://msdn.microsoft.com/ja-jp/library/t9zea13t.aspx

    2015年11月26日 5:33
  • ご指摘、ありがとうございます。

    独りよがりな質問でご迷惑をおかけしています。

    そもそも、ShiftJISのみを扱っていた頃のソフトの考え方をそのまま残して、

    UNICODE対応可のソフトを作っていることに起因します。

    例えば、データ入力の際、入力可能桁数を半角10桁に設定すると、

    ”9876543210”/”あいうえお”/”12𠀋𠀋3㐂4”

    などがMAXとなり、それ以上の入力を禁止します。

    また、ある文字列の、5桁目から7桁目までに、別の文字列の1桁目から3桁目をセットするという設定では(半角で)、

    ”12𠀋𠀋3㐂4”←この文字列に、”9876543210”←この文字列をセットする場合、

    結果は、”12𠀋987㐂4”としなければなりません。

    何かにつけ、ShiftJISでいうところの、半角/全角を意識した処理をする必要があり、

    今回のような質問をさせていただきました。

    説明不足と理解不足でお時間をとらせてしまい申し訳ありませんでした。

    今後ともご指導よろしくお願いいたします。


    kizakura_ui

    2015年11月26日 7:12
  • 私の話は通じてますでしょうか?

    > 調べたところ、UNICODEにおける半角の範囲は、
    > 0x0 ~ 0x80, 0xf8f0, 0xff61 ~ 0xff9f, 0xf8f1 ~ 0xf8f3
    > と書かれてありました。
    > これが正解かどうかはわかりませんが、私の定義は不十分でした。

    あくまで質問者さんの定義による全角 / 半角は何かというところをお聞きしたいのですが。

    前に書いてあったとおり (0x0020 <= (c)) && ((c) <= 0x007f) と (0xff61 <= (c)) && ((c) <= 0xff9f) が半角で、それ以外は全角ということであればそれはそれでいいです。質問者さんが決めることですから。決めてもらえればそれをベースに話はできます。

    そもそもの質問は、ある Unicode 文字列(サロゲートペアを含む)があって、質問者さんの定義による半角文字を 1 としてカウント、全角文字を 2 としてカウントし、その文字列全体のカウント合計を算出したいということですよね。

    でも、そういう質問なのに、どっかに書いてあった半角の範囲を出してしかも「これが正解かどうかはわかりません」ということでは話が進まないと思うのですが。

    2015年11月26日 8:07
  • まず、原理的に

    1.過去の永続化されたデータの構造上、文字列がBYTE数で指定されている。
     かつShiftJISが前提となっている。かつこれを変えてはならない。

    のならば、そもそもそれらのデータをUnicodeで扱ってはいけません。
    次に、新規アプリがこれらの構造を変えらるのならば、

    2.文字コードをUTF-16に統一さえすればShiftJISの出番は無い。
     この際、過去にBYTEインデックス扱いだったものは、文字のインデックス扱いに変更。
     従って全角半角の判定も不要。

    とできる可能性が高いです。
    個人の感想ですが、中途半端な折衷案は採用すべきではないと考えられます。

    2015年11月26日 8:25
  • 【追伸】

    半角 / 全角の定義が最初の話の通りでよければ、サロゲートの扱いに注意して以下のようにしてカウントできると思います。(もっとスマートは方法があるかもしれませんが)

    String unicodeString = "あ𠀋123あ㐂あ456";
    Console.WriteLine("Original unicode string: " + unicodeString);

    // 𠀋 はサロゲートなので 2 つの Char オブジェクトを使用。結果 unicodeString.Length は 12 になる。 Console.WriteLine(String.Format("Original unicode string length: {0}", unicodeString.Length)); Byte[] unicodeBytes = Encoding.Unicode.GetBytes(unicodeString); Console.WriteLine(); Console.WriteLine("Unicode Encoded bytes:"); foreach (Byte bt in unicodeBytes) { Console.Write("[{0:X}]", bt); } Console.WriteLine(); Console.WriteLine("Number of bytes: {0}", unicodeBytes.Length); for (int i = 0; i < unicodeString.Length; i++) { Char ch = unicodeString[i]; Console.Write(ch); if (Char.IsHighSurrogate(ch)) { Console.WriteLine(" :high surrogate => low surrogate と合わせて 2 バイト扱い"); } else if (Char.IsLowSurrogate(ch)) { Console.WriteLine(" :low surrogate => high surrogate と合わせて 2 バイト扱い"); } else if ((!((0x0020 <= (ch)) && ((ch) <= 0x007f))) && (!((0xff61 <= (ch)) && ((ch) <= 0xff9f)))) { Console.WriteLine(" :全角 => 2 バイト扱い"); } else { Console.WriteLine(" :半角 => 1 バイト扱い"); } }

    上のコードの実行結果は以下のようになります。

    Original unicode string: あ??123あ?あ456
    Original unicode string length: 12

    Unicode Encoded bytes:
    [42][30][40][D8][B][DC][31][0][32][0][33][0][42][30][2][34][42][30][34][0][35][0][36][0]
    Number of bytes: 24
    あ :全角 => 2 バイト扱い
    ? :high surrogate => low surrogate と合わせて 2 バイト扱い
    ? :low surrogate => high surrogate と合わせて 2 バイト扱い
    1 :半角 => 1 バイト扱い
    2 :半角 => 1 バイト扱い
    3 :半角 => 1 バイト扱い
    あ :全角 => 2 バイト扱い
    ? :全角 => 2 バイト扱い
    あ :全角 => 2 バイト扱い
    4 :半角 => 1 バイト扱い
    5 :半角 => 1 バイト扱い
    6 :半角 => 1 バイト扱い


    • 編集済み SurferOnWww 2015年11月26日 8:45 コード欠落部分追加
    • 回答としてマーク kizakura_ui 2015年11月26日 11:37
    2015年11月26日 8:42
  • 現実的にはほとんどない気はしますけど、ここまでやるのであればStringInfoを使った方がいい気がしないでもないです(異体字セレクタとかも出てきたことですし)。

    --追記

    あ、異体字セレクタってそもそも.NET Frameworkの機能では対応してないんでしたっけ?だとこれではダメかもしれないですね。

    • 編集済み なちゃ 2015年11月26日 10:16
    2015年11月26日 9:54
  • 現実的にはほとんどない気はしますけど、ここまでやるのであればStringInfoを使った方がいい気がしないでもないです(異体字セレクタとかも出てきたことですし)。

    --追記

    あ、異体字セレクタってそもそも.NET Frameworkの機能では対応してないんでしたっけ?だとこれではダメかもしれないですね。

    「.NET Frameworkの機能」がどこからどこまで指すかって話ですが、とりあえず.NET 4.6のStringInfoは対応していますね。

    そういえば結合文字とかもありますね-。

    2015年11月26日 10:36
  • ありがとうございます。

    >そもそもの質問は、ある Unicode 文字列(サロゲートペアを含む)があって、質問者さんの定義による半角文字を 1 としてカウント、全角文>字を 2 としてカウントし、その文字列全体のカウント合計を算出したいということですよね。

    はい、その通りです。

    それで、

    Encoding sjisEnc = Encoding.GetEncoding("Shift_JIS");
    int len = sjisEnc.GetByteCount(str);

    これで求められると思い込み、試してみたところ、正しい結果がでなかったので、

    質問させていただきました。

    そして、皆様からご指導いただいて、この方法は、UNICODE限定文字が含まれていない場合に限る、ということがわかりました。

    元々は、C++で独自にカウントしていまして、

    その方法が、半角の範囲以外を全角と判断し(←ここで、”半角の範囲”を使っています)、

    さらにサロゲートペアの場合は、一つ配列を進める、というものでした。

    またとんちんかんなお返事になっていましたらお許しください。


    kizakura_ui

    2015年11月26日 11:24
  • おっしゃる通り、”BYTEインデックス扱い”のまま、UNICODE対応をしようとしているため、

    色々問題にぶつかっています。

    ただ、詳しい説明が難しいのですが、BYTE扱いで設定しているフォーマットファイルなる資産が、

    多数のユーザー様で大量に作られているので、その考え方を変えるわけにはいかなく、

    またデータに、氏名や住所がよく出てくるため、UNICODE対応しないわけにもいかず、

    で、現状のようになっています。


    kizakura_ui

    2015年11月26日 11:32
  • お時間とっていただきありがとうございます。

    冒頭で記載させていただいた関数を、

    ご指導いただいた方法で改良してみたいと思います。

    今後ともよろしくお願いいたします。


    kizakura_ui

    2015年11月26日 11:36
  • ありがとうございます。

    1文字ずつ取り出す処理の際にStringInfoは使っています。

    BYTEカウントのための利用方も考えてみます。

    今後ともご指導よろしくお願いいたします。


    kizakura_ui

    2015年11月26日 11:43
  • > この方法は、UNICODE限定文字が含まれていない場合に限る、ということがわかりました。

    いえ、そうではなくて「シフト JIS に限る」ということです。どう言ったら分かってもらえるのだろう・・・

    どう見ても基本的ところを理解されてないように思えます。ごくごく基本的なことです。ちょっと勉強すれば分かるはずですので頑張ってみてください。

    2015年11月26日 12:30
  • すみません。

    出直しますm(_ _)m


    kizakura_ui

    2015年11月26日 13:17
  • 今更ですが、

    私のところも同じような状況。
    前のアプリがShift-JISで作成されていて、仕様制定者が、半角/全角文字幅という代りに、1-byte/2-byteというので、しばらく悩みました。 でも新規作成は、Unicode。 理解しているとは思えません。
    多分、半角 xx文字分の領域に収まる文字数を入力/出力したいのだと思います。文字位置の基準も半角文字単位とするみたいな。 Shift-JIS範囲の文字とすれば、話は早いのですが、Unicodeにしたから、Unicodeの文字も使えるようにしろ、という要求ではないかと、推測します。

    で、簡単には、半角英数文字と、半角カナを半角文字(1-byte文字)扱いとすれば、話は簡単ですが、Shift-JISに無い文字もUnicodeにはあるじゃないかと、言われると面倒。 アラビア文字とか、インド文字は、MSゴシックにしてもピッチが異なります。(メモ帳で確認) さすがに国内のアプリなら、非サポートとしても良いでしょうが、ユーロ(€)とか、ウォン(₩)とかはありそう。
    それ以前でも、Unicode使い出すと、Shift-JISに無い漢字を使い出す人が出るので要注意ですね。

    どこまでサポート範囲するか、まず明確にすべきです。
    自分のところについては、諦めています。問題となった時に、仕様制定者に対応を問合せ。

    2015年11月26日 15:19
  • その対応でご苦労されている方、少なくないのでは、と思います。

    こちらは、数年前にC++でUNICODE対応版を作って(1年くらいかかりました)、問題なく動いています。

    それを今、C#に移植しようとして、なにかと問題にぶつかっているところです。

    (このフォーラムでも大変お世話になっています。)

    できるだけC#のクラスを利用したいと思っているのですが、

    知識もなく、また

    文字列なども、C++の結果と寸分たがわず出力しないといけないため、

    試行錯誤の末、結局gdi32.dllを・・・

    余談、すみません。

    今後とも、ご指導よろしくお願いいたします。


    kizakura_ui

    2015年11月27日 0:10
  • > その対応でご苦労されている方、少なくないのでは、と思います。
    > こちらは、数年前にC++でUNICODE対応版を作って(1年くらいかかりました)、問題なく動いています。
    > それを今、C#に移植しようとして、なにかと問題にぶつかっているところです。

    質問者さんが最初の質問にアップした iskanji, issurhigh, issurlow, GetCharInfo はそのままコピペして C# のコードとして動きます。

    C++ のコードで数年前から問題なく動いていると言うのであれば、C# でもそのままコピペすればやはり問題なく動くはずです。C# のコンソールアプリでも作って試してみてください。

    本来の目的が、最初の質問にアップした iskanji, issurhigh, issurlow, GetCharInfo のコードの「C#に移植」であれば、「苦労」はコピペして検証するだけですむはずです。

    なので、最初の質問の、

    > String str = "あ𠀋123あ㐂あ456";
    > Encoding sjisEnc = Encoding.GetEncoding("Shift_JIS");
    > int len = sjisEnc.GetByteCount(str);

    の方向に進んで余計な「苦労」はする必要はなかったはずです。

    誤って進んでしまったとしても、"あ𠀋123あ㐂あ456" には Shift_JIS にない文字を含んでいると言う指摘を受けた時点で、sjisEnc.GetByteCount(str) は無意味ということがすぐに理解できたはずで、その先の「苦労」は必要なかったはずです。

    ごく基本的な知識があれば「苦労」のかなりの部分はなくなると思います。掲示板での話も通じやすくなります。

    ちょっと勉強すれば基本的な知識は習得できると思いますので頑張ってみてください。

    2015年11月27日 3:37
  • 文字列なども、C++の結果と寸分たがわず出力しないといけないため、試行錯誤の末、結局gdi32.dllを・・・

    明確な仕様がありそれに沿った実装を行うならC#でもいいですが、C++実装と同じ動作をさせたいのであればC#化すべきではないと思います。

    つまり、時代はどんどん進化しており

    • JIS第3水準、第4水準
    • 異体字セレクタ
    • カラー絵文字
    • リガチャ
    • High DPI
    • サブピクセルレンダリング

    などなど。こういったものにどう対応していくか、明確な方針はあるのでしょうか? C++で設計された時には存在しなかったものであり、どう対応すべきかはそもそも定まっていないのではと。にもかかわらずC++と寸分たがわない出力が求められるというのであれば、不可能という結論しか見つかりません。

    2015年11月27日 4:08
  • アドバイス、ありがとうございます。

    はい、C++のコードのまま、C#でもうまく動作していました。

    その後、別の処理でGetByteCount()のことを知り、

    書き換えてみたところ同じ結果が得られなかったので・・・

    基礎知識もないまま、不必要にC#のクラスを使おうとして、

    皆様の貴重なお時間を潰してしまい、申し訳ありませんでした。


    kizakura_ui

    2015年11月27日 5:07
  • アドバイス、ありがとうございます。


    kizakura_ui

    2015年11月27日 5:08