いつも参考にさせて頂いております。
LeftB を使用する時に文字化けが出てしまう件で、
いろいろ調べてみたのですが分かりません。
どなたか分かる方がいらっしゃいましたらご伝授下さい。
Dim A As String
Dim B As String
'11バイトデータを左から10バイトだけ取り出したい。
'下記の場合「う」が半分に切れてしまい、文字化けが発生してしまいます。
A = "12あ34い5う"
B = LeftB$(A, 10)
'答え 12あ34D
'希望 12あ34い5
なき別れを意識する場合ははやり一文字ずつ見ていくしかなさそう。
Dim s1 As String
Dim s2 As String
Dim buf As String
Dim i As Integer
Dim total As Integer
s1 = "12あ34い5う"
For i = 1 To Len(s1)
buf = Mid$(s1, i, 1)
total = total + LenB(StrConv(buf, vbFromUnicode))
If total > 10 Then
Exit For
End If
s2 = s2 & buf
Next
MsgBox s2
本当にこの「答え」の文字列がBに入るのなら、いろいろ問題がありそうですが・・・
'11バイトデータを左から10バイトだけ取り出したい。
'下記の場合「う」が半分に切れてしまい、文字化けが発生してしまいます。
A = "12あ34い5う"
のAは11バイトではなく
16バイトではないでしょうか?
msgbox LENB(A)でご確認ください。
VB6.0で確認
通常半角2バイト、全角4バイトですけどね・・・・・
> 通常半角2バイト、全角4バイトですけどね・・・・・
これってなんの通常でしょうか?
Blueさん の指摘ありがとうです。
勘違いしてました。
&hFFで1バイト
&hFFFFで2バイト
ですよね・・
Fの個数を数えてました。
お恥ずかしい
msgbox LenB(StrConv("12あ34い5う", vbFromUnicode))
11
msgbox lenb("12あ34い5う")
16
となるのですね
また、WINのVBAとMACのVBAで違いがあるようですね。
皆様有難うございます。
半角2バイト、全角4バイトと思っていました私でした。
>&hFFで1バイト
>&hFFFFで2バイト
を勉強してみます。
とりあえず、Blue 様の方法で回避してみますm(__)m
解決されているようで、後の祭りかもですが、
以下の回避方法もあるかと思います。
http://jeanne.wankuma.com/tips/string/leftb.html
> http://jeanne.wankuma.com/tips/string/leftb.html
この方法では、2バイト文字の泣き別れが回避できません。
Dim A As String
Dim B As String
Dim II As Long
Dim ABC As String
Dim AA As Long
Dim BBB As String
Dim TT As String
A = "12あ34いう5"
ABC = StrConv(A, vbFromUnicode)
AA = LenB(ABC)
BBB = LeftB$(ABC, 10)
TT = StrConv(BBB, vbUnicode)
'------------<全角文字をバイト切断した場合の処理
If Right$(TT, 1) < Chr$(&H10) Then
ABC = StrConv(TT, vbFromUnicode)
AA = LenB(ABC) 'バイト数
BBB = LeftB$(ABC, ll - 1)
TT = StrConv(BBB, vbUnicode)
End If
'---------------<ここまで追記
B = TT
他のHPに載っていたものをアレンジしてみました。
どうでしょうか?
> If Right$(TT, 1) < Chr$(&H10) Then
このような判定が出来るとは知りませんでした。
Shift_JISコードの2バイト文字の先行バイトだけを
StrConvでUnicodeにしたときの結果が動作が必ず保障できるならば
このコードのほうが見やすいかもしれませんね。
(ただ、何度かStrConvしているので速度的には遅そうですけど)
ツイート | ![]() |