- ベストアンサー
VB6で漢字の1バイト目か2バイト目かの判定
例えば、"123あいう"と"4え5おか"という文字があるとします。 これを前から5バイト取得したい、ただし、5バイト目が漢字の1バイト目なら4バイトを取得したいのですが、漢字の1バイト目か2バイト目か簡単に判定する方法をご存知の方いらっしゃらないでしょうか? よろしくお願い致します。 "123あいう"は、"123あ"と"いう"に、 "4え5おか"は、"4え5"と"おか"に分割したいということです。
- みんなの回答 (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
その他の回答 (2)
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
「(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
お礼
回答ありがとうございました。 私の質問の仕方が悪かったのか、意図したものとズレがありました・・・申し訳ないです。
通常は、 ? 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
お礼
回答ありがとうございました。 私の質問の仕方が悪かったのか、意図したものとズレがありました・・・申し訳ないです。
お礼
回答ありがとうございました。 私の質問の仕方が悪かったのか、意図したものとズレがありました・・・申し訳ないです。