Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

VB6.0のmidb()とmid()との戻り値に関して

103 views
Skip to first unread message

Ken.K

unread,
Feb 23, 2010, 5:11:01 AM2/23/10
to
お世話になります。

動作環境:WindowsXP、VisualBasic6.0(SP6)

VB6.0のmidb()とmid()との戻り値に関して質問があります。

(以下サンプルプログラム)

Private Sub Command1_Click()

Dim wStr As String
Dim wChar1 As String
Dim wChar2 As String

wStr = "ABCDEFG"

For i = 1 To 7
wChar1 = Mid(wStr, i, 1)
wChar2 = MidB(wStr, i, 1)

If wChar1 <> wChar2 Then
MsgBox ("エラー")
Exit Sub
End If
Next i

MsgBox ("完了")

End Sub

(ここまで)

上記プログラムを実行すると 変数wChar1 がS-Jis、wChar2 がUnicodeなのでIF文内に入ってしまうのは分かりました。

したがって、wChar2 = strConv(wChar2,vbFromUnicode)を行なったのですが、wChar2 はNullになってしまいます。
ここで煮詰まってしまってます。
上記プログラムを完了させる方法、または代替の案がありましたらご教授願います。

UETA, Shin-ichi

unread,
Feb 24, 2010, 2:20:07 AM2/24/10
to
こんにちは、植田です。

Ken.K wrote:
> wChar2 = MidB(wStr, i, 1)

これではUnicode形式の文字列に対してMidB関数を呼び出すことに
なるので期待した結果にはならないでしょう。
wChar2には"A"、NUL、"B"、NUL、"C"、NUL、"D" が代入され、
null文字の分だけずれてしまいます。

正しくは ――

wChar2 = MidB(StrConv(wStr, vbFromUnicode), i, 1)

―― とするべきではないかと。

# 効率を考えるならwStrのANSI版をキャッシュしておくべきですね。

Ken.K wrote:
> If wChar1 <> wChar2 Then
> MsgBox ("エラー")
> Exit Sub
> End If

これではUnicode形式の文字列とANSI形式の文字列を比較すること
になるので、一致することはなく、結果的に「エラー」を表示します。

正しくは ――

If wChar1 <> StrConv(wChar2, vbUnicode) Then

End If

―― とするべきではないかと。

# wChar1の方をANSI形式の文字列に変換して比較してもOK。

Ken.K wrote:
> 上記プログラムを実行すると 変数wChar1 がS-Jis、wChar2 がUnicodeなので
> IF文内に入ってしまうのは分かりました。

逆では?

wCahr1がUnicode形式の文字列で、wChar2がANSI(Shift-JIS)形式の
文字列になるはずです。

Ken.K wrote:
> したがって、wChar2 = strConv(wChar2,vbFromUnicode)を行なったのですが、
> wChar2 はNullになってしまいます。

wChar2はANSI形式の文字列なので、それをvbFromUnicodeで変換
するのは矛盾します。


--
植田システム設計事務所
Ueta System Design Studio
http://www.usdesign.jp/
植田真一
mailto:ue...@usdesign.jp


Ken.K

unread,
Feb 25, 2010, 9:23:01 PM2/25/10
to
植田様

返信が遅くなりました。
丁寧なご回答ありがとうございます。
お陰様で理解することが出来ました。


"UETA, Shin-ichi" からの元のメッセージ:

> .
>

0 new messages