■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(1(左):あまり役立たない - 5(右):大変役立った):
■ ページの共有:
[ サイト内検索 ]
カスタム検索
#8387-0二バイト文字とANK文字の混合文字列ちぇきね2000-03-09(木) 14:19
     #8395-0RE#8387:二バイト文字とANK文字の混合文字列Kuroneko2000-03-09(木) 16:16
     #8396-0RE#8387:二バイト文字とANK文字の混合文字列JI2000-03-09(木) 16:23
#8387-0
二バイト文字とANK文字の混合文字列
UNIXとWINSOCKをつかってデータのやり取りをするプログラムを作ってます。
送られてくるデータが制御文字・ANK・二バイトコードが混合の文字列を送ってきます。
そのデータをばらすプログラムを作っています(漢字コードはSJIS)
下記のコードで

iPos2 = InStrB(1, sTemp, "&")       '       STEMPの内容 "観察局1&観察局2&観察局3"
BUSYO = MidB(sTemp, 1, iPos2 - 1)   '←?  ここでは”観察局1”の結果になります。
sTemp2 = MidB(sTemp, iPos2 + 1, 2)  '←?  ここでは”?”となります。

?のMID関数で"&"以降を取り出してループして"&"がなくなるまで実行します。
?のMID関数がいきなり、おかしな値になるのですが、原因がつかめません。
BUSYO,stemp2はストリング型です。
よろしくお願いします。
#8395-0
RE#8387:二バイト文字とANK文字の混合文字列
> UNIXとWINSOCKをつかってデータのやり取りをするプログラムを作ってます。
> 送られてくるデータが制御文字・ANK・二バイトコードが混合の文字列を送ってきます。
> そのデータをばらすプログラムを作っています(漢字コードはSJIS)
> 下記のコードで
> 
> iPos2 = InStrB(1, sTemp, "&")       '       STEMPの内容 "観察局1&観察局2&観察局3"
> BUSYO = MidB(sTemp, 1, iPos2 - 1)   '←?  ここでは”観察局1”の結果になります。
> sTemp2 = MidB(sTemp, iPos2 + 1, 2)  '←?  ここでは”?”となります。
> 
> ?のMID関数で"&"以降を取り出してループして"&"がなくなるまで実行します。
> ?のMID関数がいきなり、おかしな値になるのですが、原因がつかめません。
> BUSYO,stemp2はストリング型です。
> よろしくお願いします。
> 
 掲示板の内容から考えると,sTempに"観察局1&観察局2&観察局3"という混合文字列(コード?)
が入ったデータ(データ型がなにかわかりませんが・・・)を切り分けるというものですが,純粋に文
字列をひろうようにすればいいのではないでしょうか?
MidBやLeftB,RightBなどの関数はバイト単位で取得するものですが,2バイト文字がある場合にこの
関数を使うとおそらく文字化けを起こしているはず・・・。原因については先に挙げた関数のヘルプ
や「1バイト文字と2バイト文字の混在するデータ」をみてもらうと参考になるとおもいます。
 上のコードだけで判断すると,

   iPos2 = InStr(1, sTemp, "&")
      BUSYO = Mid(sTemp, 1, iPos2 - 1)
      sTemp2 = Mid(sTemp, iPos2 + 1, 2)

 で値は取得できると思うのですがどうでしょうか?
#8396-0
RE#8387:二バイト文字とANK文字の混合文字列
> UNIXとWINSOCKをつかってデータのやり取りをするプログラムを作ってます。
> 送られてくるデータが制御文字・ANK・二バイトコードが混合の文字列を送ってきます。
> そのデータをばらすプログラムを作っています(漢字コードはSJIS)
> 下記のコードで
> 
> iPos2 = InStrB(1, sTemp, "&")       '       STEMPの内容 "観察局1&観察局2&観察局3"
> BUSYO = MidB(sTemp, 1, iPos2 - 1)   '←1)  ここでは”観察局1”の結果になります。
> sTemp2 = MidB(sTemp, iPos2 + 1, 2)  '←2)  ここでは”?”となります。
> 
> 2)のMID関数で"&"以降を取り出してループして"&"がなくなるまで実行します。
> 2)のMID関数がいきなり、おかしな値になるのですが、原因がつかめません。
> BUSYO,stemp2はストリング型です。
> よろしくお願いします。
> 
通信をS-JISコードで行うとしてもVBが管理する文字コードはUnicodeです。

ですから、S-JIS上の2バイト文字(全角文字)と1バイト文字(半角文字)に
関係なくVBで管理される文字は全て2バイトです。

"観察局1&観" を Unicodeの16進で表現すると
89B3 5BDF 5C40 FF11 0026 89B3
となります。

iPos2 = InStrB(1, sTemp, "&")のiPos2は9なので
Mid(sTemp, iPos2 + 1, 2)は、10バイト目と11バイト目を取得するので
取得する文字コードは2689となります。
たぶん、Unicodeで2689に割り当てられている文字が存在しない
または、文字化けでしょう

InStrB/MidB関数ではなく、InStr/Mid関数に変更すればよいと思います。

# ○1、○2等は機種依存文字なので、次回からは使用しないように
# 気をつけましょう(半角カナと同じ理由です)
このページと関連する記事:
#20086-0文字化け判定2001-04-06(金) 09:26
#3418-2文字列操作について教えて下さい2001-12-28(金) 12:22
#5783-0LenB、MidBのバグ?2002-03-08(金) 10:53
#23301-0128バイト目がズレちゃう2001-09-21(金) 16:15
#2089-1winsockの受信バッファクリア2004-05-12(水) 18:52
#20134-0全角の1バイト目のコードなのか評価したい。2001-04-09(月) 09:45
#1640-0MidB関数2005-04-08(金) 16:50
#35661-0全角と半角が混同している、CSVではないテキストファイルの分解2000-12-19(火) 15:48
#7817-0VBでバイナリデータをRS232Cで送るには?1999-10-20(水) 18:57
#31875-0文字列をバイト単位で切る2000-10-17(火) 22:16
お探しの情報は見つかりましたか?お困りの問題は解決しましたか?
サイト内検索, 似た記事検索で見つからなくてもあきらめずに掲示板で質問してみましょう。
VB初心者友の会があなたのお役に立てれば幸いです。また、本ページの投稿者の方々にこの場を借りて感謝致します。
本ページは過去ログを集めて自動構成しています。よろしければこのページに関するフィードバックをお願いします。
(※ 構成の誤り、広告等の不適切な記事、リンク切れ、読めないページの報告など)