- PR -

VBからC#のクラスを呼び出した場合の不具合?

投稿者投稿内容
creep
会議室デビュー日: 2004/01/15
投稿数: 6
投稿日時: 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 ]
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-06-30 23:55
諸農です。

以下のコードで試してみましたが、想定通りの結果が戻ってきます。

コード:
C#クラス
namespace EncodingLib
{
    public class TestLib
    {
        public TestLib(){ }
        static public int GetCheck(string AStr)
        {
            System.Text.Encoding enc = System.Text.Encoding.GetEncoding("shift-jis");
            return enc.GetByteCount(AStr);
        }
        static public int GetCheck(string AStr,string AEncName)
        {
            System.Text.Encoding enc = System.Text.Encoding.GetEncoding(AEncName);
            return enc.GetByteCount(AStr);
        }
    }
}

C#テスターコード
private void button1_Click(object sender, System.EventArgs e)
{
    label1.Text = EncodingLib.TestLib.GetCheck(textBox1.Text).ToString();
}

VBテスターコード
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Label1.Text = EncodingLib.TestLib.GetCheck(TextBox1.Text).ToString()
End Sub



何か他に見落としているものや条件などはありませんか?


_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
ぢゃん♪
大ベテラン
会議室デビュー日: 2003/06/12
投稿数: 208
お住まい・勤務地: 都内
投稿日時: 2004-07-01 08:37
私が思うに、
引用:

creepさんの書き込み (2004-06-30 19:51) より:

VBからC#のクラスライブラリ内のバイト数を計算する静的メソッドに半角の"1"設定して呼び出したところ,
想定する結果の1バイトが帰ってこず2バイトだといわれます。


だけでなく
引用:

(全角を1文字入れると3バイトだといわれます。)


とあるので、「文字列」なるものが明らかにおかしいと思うんですが……。
どう考えても、1バイト分ゴミが入っていますよ。
コード:

Dim i as Int32 = C#のクラス.ByteCheck(文字列)


の「文字列」は、一体どのような手段で入力もしくは取得していますか?
そもそも「文字列.Length」の値が、両ケースとも1であることは、確認できていますか?

[ メッセージ編集済み 編集者: ぢゃん♪ 編集日時 2004-07-01 08:47 ]
creep
会議室デビュー日: 2004/01/15
投稿数: 6
投稿日時: 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 ]
creep
会議室デビュー日: 2004/01/15
投稿数: 6
投稿日時: 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 ]
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2004-07-02 14:45
引数で渡されているのはtext、長さチェックを行っているのはtxですが、これはtypoですか?

txがインスタンスフィールドに宣言されているのですか?
インスタンスフィールドに宣言され、ごみデータが入っていれば、おかしなことになりますよ.
creep
会議室デビュー日: 2004/01/15
投稿数: 6
投稿日時: 2004-07-02 15:23
引用:

かずくんさんの書き込み (2004-07-02 14:45) より:
引数で渡されているのはtext、長さチェックを行っているのはtxですが、これはtypoですか?

txがインスタンスフィールドに宣言されているのですか?
インスタンスフィールドに宣言され、ごみデータが入っていれば、おかしなことになりますよ.



すみません、私のミスです。
txはtextはです。インスタンスフィールドではなく、パラメータです。
訂正しておきました。
Qoo
大ベテラン
会議室デビュー日: 2003/04/08
投稿数: 121
投稿日時: 2004-07-02 15:43
こんにちは。

C#のクラスライブラリの処理をVB.NETで記述した場合の
動作はどうなりますか?

スキルアップ/キャリアアップ(JOB@IT)