- - PR -
VBからC#のクラスを呼び出した場合の不具合?
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-06-30 19:51
はじめまして。
今回摩訶不思議な現象に出くわしました。詳細について解る方は教えてください。 <現象> VBからC#のクラスライブラリ内のバイト数を計算する静的メソッドに半角の"1"設定して呼び出したところ, 想定する結果の1バイトが帰ってこず2バイトだといわれます。 (全角を1文字入れると3バイトだといわれます。) で、ためしにC#のクラス内にて文字列をShift_jisのバイト配列に入れたところ その配列のLengthは1になります。 以下にそのコードを乗せるので何かわかる方は意見をください。 今回は、クラスライブラリをC#で作っているのですがVBから使用する場合に何か 問題があるのではないかと不安です。よろしくお願いします。 <<VBのコード>> 'ここでは文字列に半角の1を指定しています。 Dim i as Int32 = C#のクラス.ByteCheck(文字列) 'ここでiを見ると2が入っています。???? <<C#クラスライブラリ内のstaticメソッド>> /// <summary> /// 文字列のバイト数を返す /// </summary> /// <returns >バイト数</returns> /// <param name="text">チェック対象文字列</param> public static Int32 ByteCheck(String text) { Encoding sjisEnc = Encoding.GetEncoding("Shift_jis"); //バイト数をリターン return sjisEnc.GetByteCount(text); } [ メッセージ編集済み 編集者: creep 編集日時 2004-06-30 19:54 ] | ||||||||||||
|
投稿日時: 2004-06-30 23:55
諸農です。
以下のコードで試してみましたが、想定通りの結果が戻ってきます。
何か他に見落としているものや条件などはありませんか? _________________ 諸農和岳 Powered by Turbo Delphi & Microsoft Visual Studio 2005 十兵衛@わんくま同盟 http://blogs.wankuma.com/jubei/ | ||||||||||||
|
投稿日時: 2004-07-01 08:37
私が思うに、
だけでなく
とあるので、「文字列」なるものが明らかにおかしいと思うんですが……。 どう考えても、1バイト分ゴミが入っていますよ。
の「文字列」は、一体どのような手段で入力もしくは取得していますか? そもそも「文字列.Length」の値が、両ケースとも1であることは、確認できていますか? [ メッセージ編集済み 編集者: ぢゃん♪ 編集日時 2004-07-01 08:47 ] | ||||||||||||
|
投稿日時: 2004-07-01 08:50
返答ありがとうございます。
状況としては、VBのWindowsフォームのTextBoxから半角の"1"をTrimをかけて入れています。 で、デバック時以下のコードを実行してみると確かに何かごみ?がはいっています。 ですが[文字列.Length」の値は1でした。 ますます解らなくなってきました。よろしくお願いします。 <デバック時実行コード> @? sjisEnc.GetBytes(text) {Length=2} [0]: 49 [1]: 0 A?text.Length 1 B?text "1" [ メッセージ編集済み 編集者: creep 編集日時 2004-07-01 08:51 ] | ||||||||||||
|
投稿日時: 2004-07-02 13:43
遅くなりましたが、一応進展したのでお伝えします。
最初に書いたコードと違うのですが以下のがクラスライブラリ内の詳細なコードです。 public static Boolean LenCheck(Int32 max,String text) { Encoding sjisEnc = Encoding.GetEncoding("Shift_jis"); //レングスチェック if (max < sjisEnc.GetByteCount(text)){ return false; } else { return true; } } ここで、デバック時にsjisEnc.GetByteCount(text)を直にウオッチにて見ると text=1(半角)なのに2が入ってます。 しかし、これを Int32 sjisByte = sjisEnc.GetByteCount(text); とするとsjisByte にはちゃんと1が入ってました。 最初に書いたコード return sjisEnc.GetByteCount(text); ではちゃんと1が入ってきます。 書いたコードが間違っていましたすみません。 実際の現象は、sjisEnc.GetByteCount(text)を直に比べたことでおきている と思われます。 何かわかる人お願いします。 [ メッセージ編集済み 編集者: creep 編集日時 2004-07-02 13:46 ] [ メッセージ編集済み 編集者: creep 編集日時 2004-07-02 13:47 ] [ メッセージ編集済み 編集者: creep 編集日時 2004-07-02 15:21 ] | ||||||||||||
|
投稿日時: 2004-07-02 14:45
引数で渡されているのはtext、長さチェックを行っているのはtxですが、これはtypoですか?
txがインスタンスフィールドに宣言されているのですか? インスタンスフィールドに宣言され、ごみデータが入っていれば、おかしなことになりますよ. | ||||||||||||
|
投稿日時: 2004-07-02 15:23
すみません、私のミスです。 txはtextはです。インスタンスフィールドではなく、パラメータです。 訂正しておきました。 | ||||||||||||
|
投稿日時: 2004-07-02 15:43
こんにちは。
C#のクラスライブラリの処理をVB.NETで記述した場合の 動作はどうなりますか? |