• ベストアンサー

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

  • EUCの漢字第1バイトを判定する

    EUCの文字列の最終文字が漢字第1バイトであるかを判定 したいのですが・・・・。 char work[21]; . . memcpy(work, &buf[0], 20); if(work[19] >= 0xa1 && work[19] <= 0xdd || work[19] >= 0xdf && work[19] <= 0xfe){ . . このようなコードでworkにコピーした文字列の最後の文字が 漢字第1バイトか判定しています。 しかし、コンパイルではwaningがでて処理もうまくいきません。 よい方法を教えていただけないでしょうか? よろしくお願いします。

  • 2byte文字の判定

    お世話になります。 2バイト文字かどうかの判定のやり方ですが、 String a = "";//←判定したい1文字(とりあえずStringとします) byte[] b = a.getByte(); if((int)b[0]<0){ //2byte文字 }else{ //1byte文字 } という判定の方法はありですか? それとも根本的に考え方間違えてますでしょうか??

    • ベストアンサー
    • Java
  • 漢字、カタカナ、ひらがな、英数字の判定

    perl5.8.5でCGIのプログラムを作っています。 入力された文字(2バイト文字)が「漢字」「カタカナ」「ひらがな」「英数字」「その他」のどれなのか文字種類を判定したいと思っています。 プログラムの文字コードはEUCで書いています。 よろしくお願いします。

  • Javaで文字を漢字であるか否かを判定する

    ある文字を、漢字であるかそれ以外であるかを判定したいです。Javaの標準でそのようなことは可能なのでしょうか。お手数をおかけしますが、宜しくお願い致します。

    • ベストアンサー
    • Java
  • 常用漢字?でない文字を判定する方法を探しています。

    文字コードがUTF8のファイルがあります。 この中に、SJISで表示できない文字があり、常用漢字?でない文字を判定する方法を探しています。 文字コードに詳しい方教えてください。 アルゴリズムは、perlでもCでも構いません。

    • ベストアンサー
    • Perl
  • VB2005でJIS拡張漢字の各文字コードを取得する方法

    ある関数に文字列を渡して各文字コードを取得するプログラムを作成しようとしています。 基本的な文字のコードは取得できるのですが、JIS拡張漢字のほとんどが正しく取得できません。 失敗している文字は内部的に「?」(3F)となってしまいます。 例:拡張漢字のコード値(SJIS:81B2)を変換するとコード値が「3F」になってしまう。(テキストエディタなどで文字化けすると「?」に化けるのと同じなのかな?) 正しく文字コードを取得する方法をご存知の方、またヒントなどありましたらよろしくお願いします。 【環境】WindowsXP     VisualBasic2005 【プログラムの流れ】例:SJISコードを取得する場合 文字列を受取る→1文字取得→System.Text.EncodingでSJIS指定のバイト型配列文字に変換(文字コードを取得)

  • [VBScript]バイト長の判定

    テキストのバイト長を取得したく「LenB関数」を使用したのですが、Unicodeの為、半角も全角も全て2バイトでカウントされてしまいます。 「StrConv関数」もVBScriptにはないため、どうしたものかと困っています。 一文字ずつコード値を出して、1バイトか2バイトに振り分けるという処理は、データの量からして現実的ではありません。 なにかよい方法がありましたらおしえてください。 よろしくお願いします。

  • オブジェクトの有無を判定

    表題の件につき、ぐぐったところ、 document.getElementById(id).style.visibility で判定が出来るとのことだったのですが、 取得される値が空白値になってしまいます。 他にオブジェクトの有無を判定する方法をご存知の方ご教授ください。 よろしくお願い致します。

  • VBAでコードから漢字に変換するのは

    VBAを使用していますが、コードから漢字を求める方法が見つかりません。 たとえば、3021から漢字の亜を求めたいのですが。 1バイト文字ならChr関数で求められますが、2バイト文字、つまり、漢字を求める方法が見つからないのです。 どなたか教えていただきたいのですが。

  • SJIS漢字1バイト目欠落の原因をどなたか教えてください

    Windows2000,IIS6環境でASPのアプリケーションですが、 数百件に1件の割合で変数に設定した漢字の文字化けが発生します。 原因はSJISの1バイト目の欠落によるものということは判明しましたが、なぜ1バイト目が欠落するのかどなたか原因を教えていただきたく お願い致します。