動作環境: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になってしまいます。
ここで煮詰まってしまってます。
上記プログラムを完了させる方法、または代替の案がありましたらご教授願います。
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
返信が遅くなりました。
丁寧なご回答ありがとうございます。
お陰様で理解することが出来ました。
"UETA, Shin-ichi" からの元のメッセージ:
> .
>