LeftB について

解決


最上級初心者  2006-04-20 20:28:58  No: 131033

いつも参考にさせて頂いております。

LeftB を使用する時に文字化けが出てしまう件で、
いろいろ調べてみたのですが分かりません。
どなたか分かる方がいらっしゃいましたらご伝授下さい。

    Dim A As String
    Dim B As String
    
    '11バイトデータを左から10バイトだけ取り出したい。
    '下記の場合「う」が半分に切れてしまい、文字化けが発生してしまいます。
    A = "12あ34い5う"
    B = LeftB$(A, 10)
    
    '答え  12あ34D
    '希望  12あ34い5


Blue  2006-04-20 22:10:03  No: 131034

なき別れを意識する場合ははやり一文字ずつ見ていくしかなさそう。

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


通ってみた  2006-04-20 23:24:20  No: 131035

本当にこの「答え」の文字列がBに入るのなら、いろいろ問題がありそうですが・・・


匿名希望  2006-04-21 00:16:50  No: 131036

'11バイトデータを左から10バイトだけ取り出したい。
'下記の場合「う」が半分に切れてしまい、文字化けが発生してしまいます。
A = "12あ34い5う"

のAは11バイトではなく
16バイトではないでしょうか?
msgbox LENB(A)でご確認ください。
VB6.0で確認

通常半角2バイト、全角4バイトですけどね・・・・・


Blue  2006-04-21 00:50:43  No: 131037

> 通常半角2バイト、全角4バイトですけどね・・・・・
これってなんの通常でしょうか?


匿名希望  2006-04-21 01:46:04  No: 131038

Blueさん  の指摘ありがとうです。
勘違いしてました。
&hFFで1バイト
&hFFFFで2バイト
ですよね・・
Fの個数を数えてました。
お恥ずかしい

msgbox LenB(StrConv("12あ34い5う", vbFromUnicode))
11
msgbox lenb("12あ34い5う")
16
となるのですね
また、WINのVBAとMACのVBAで違いがあるようですね。


最上級初心者  2006-04-21 21:07:48  No: 131039

皆様有難うございます。

半角2バイト、全角4バイトと思っていました私でした。
>&hFFで1バイト
>&hFFFFで2バイト
を勉強してみます。

とりあえず、Blue 様の方法で回避してみますm(__)m


初心者 その2  2006-04-21 22:03:43  No: 131040

解決されているようで、後の祭りかもですが、
以下の回避方法もあるかと思います。

http://jeanne.wankuma.com/tips/string/leftb.html


Blue  2006-04-21 22:08:43  No: 131041

http://jeanne.wankuma.com/tips/string/leftb.html
この方法では、2バイト文字の泣き別れが回避できません。


これはどうです???  2006-04-22 02:26:39  No: 131042

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に載っていたものをアレンジしてみました。
    どうでしょうか?


Blue  2006-04-22 21:19:14  No: 131043

> If Right$(TT, 1) < Chr$(&H10) Then
このような判定が出来るとは知りませんでした。

Shift_JISコードの2バイト文字の先行バイトだけを
StrConvでUnicodeにしたときの結果が動作が必ず保障できるならば
このコードのほうが見やすいかもしれませんね。
(ただ、何度かStrConvしているので速度的には遅そうですけど)


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加