• ベストアンサー

VB6で漢字の1バイト目か2バイト目かの判定

例えば、"123あいう"と"4え5おか"という文字があるとします。 これを前から5バイト取得したい、ただし、5バイト目が漢字の1バイト目なら4バイトを取得したいのですが、漢字の1バイト目か2バイト目か簡単に判定する方法をご存知の方いらっしゃらないでしょうか? よろしくお願い致します。 "123あいう"は、"123あ"と"いう"に、 "4え5おか"は、"4え5"と"おか"に分割したいということです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

5バイト取得という事でガチガチに作っていますが、 必要なら引数を調整して汎用的にして下さい。 Sub TEST() Dim pos As Integer Dim s As String s = "123あいう" pos = Left5(s) Debug.Print StrConv(MidB$(StrConv(s, vbFromUnicode), 1, pos), vbUnicode), StrConv(MidB$(StrConv(s, vbFromUnicode), pos + 1), vbUnicode) s = "4え5おか" pos = Left5(s) Debug.Print StrConv(MidB$(StrConv(s, vbFromUnicode), 1, pos), vbUnicode), StrConv(MidB$(StrConv(s, vbFromUnicode), pos + 1), vbUnicode) End Sub Function Left5(ByVal vstr As String) As Integer '切る位置が全角文字の真中かどうか判定する If Len(StrConv(LeftB(StrConv(vstr, vbFromUnicode), 5), vbUnicode)) _ = Len(StrConv(LeftB(StrConv(vstr, vbFromUnicode), 4), vbUnicode)) Then '1バイト前で切ったときに文字数が変わらないのは切った位置が全角文字の後半であるので '切り位置が正しいと判断する Left5 = 5 Else '泣き別れのパターン Left5 = 4 End If End Function

tak_y
質問者

お礼

回答ありがとうございました。 私の質問の仕方が悪かったのか、意図したものとズレがありました・・・申し訳ないです。

その他の回答 (2)

回答No.2

「(N+0)バイトの文字列の文字数」 「(N+1)バイトの文字列の文字数」 のそれぞれが ※等しい:文字の最中で切られた ※等しくない:文字の最中で切られていない という判断ができます。 Sub Test()   Debug.Print Left_ポジション補正("123あいう", 5)   Debug.Print Left_ポジション補正("4え5おか", 5) End Sub Function Left_ポジション補正(ByVal p_strWk As String, ByVal p_Postion As Long) As String   Dim l_strWk1  As String   Dim l_strWk2  As String   Dim l_lngMax  As Long      '最大文字数を取得   l_lngMax = LenByte(p_strWk)      If (l_lngMax < p_Postion) Then     '文字バイト数より多いなら、そのまま返却     Left_ポジション補正 = p_strWk   Else     '入力のバイト数の文字を取得     l_strWk1 = LefByte(p_strWk, p_Postion + 0)     '入力のバイト数+1の文字を取得     l_strWk2 = LefByte(p_strWk, p_Postion + 1)          If Len(l_strWk1) = Len(l_strWk2) Then       '[(N+0)バイト = (N+1)バイト]なら、文字最中でぶった切ったことになる       Left_ポジション補正 = LefByte(p_strWk, p_Postion - 1)     Else       Left_ポジション補正 = l_strWk1     End If   End If End Function Function LefByte(ByVal p_String As String, ByVal p_Length As Long) As String   LefByte = ConvUnicode(LeftB(ConvFromUnicode(p_String), p_Length)) End Function Function LenByte(ByVal p_String As String) As Long   LenByte = LenB(ConvFromUnicode(p_String)) End Function Function ConvFromUnicode(ByVal p_String As String) As String   ConvFromUnicode = StrConv(p_String, vbFromUnicode) End Function Function ConvUnicode(ByVal p_String As String) As String   ConvUnicode = StrConv(p_String, vbUnicode) End Function

tak_y
質問者

お礼

回答ありがとうございました。 私の質問の仕方が悪かったのか、意図したものとズレがありました・・・申し訳ないです。

noname#22222
noname#22222
回答No.1

通常は、 ? LeftH("123あいう", 4) 123 ? LeftH("123あいう", 5) 123あ と思いますが... Public Function LenH(ByVal Text As String) As Integer   LenH = LenB(StrConv(Text, vbFromUnicode)) End Function Public Function LeftH(ByVal Text As String, ByVal L As Integer) As String   Dim I As Integer   Dim J As Integer   Dim K As Integer      J = Len(Text)   For I = 1 To J     If LenH(Left$(Text, I)) > L Then       Exit For     End If     K = I   Next I   LeftH = Left$(Text, K) End Function もしかして、下のような結果を望んでいるのでしょうか? ? LeftH("123あいう", 1) 1 ? LeftH("123あいう", 2) 12 ? LeftH("123あいう", 3) 123 ? LeftH("123あいう", 4) 123あ ? LeftH("123あいう", 5) 123あ ? LeftH("123あいう", 6) 123あい ? LeftH("123あいう", 7) 123あい Public Function LeftH(ByVal Text As String, ByVal L As Integer) As String   Dim I As Integer   Dim J As Integer   Dim K As Integer      J = Len(Text)   For I = 1 To J     If Not (LenH(Left$(Text, I)) <= (L + 1) And Len(Left$(Text, I)) <= L) Then       Exit For     End If     K = I   Next I   LeftH = Left$(Text, K) End Function

tak_y
質問者

お礼

回答ありがとうございました。 私の質問の仕方が悪かったのか、意図したものとズレがありました・・・申し訳ないです。

関連するQ&A