• ベストアンサー

半角/全角文字混在データの分割方法

VB6.0にて、あるデータ項目の内容を、画面上の2つの表示領域に分割して セットする方法を教えて下さい。 あるファイルの項目として、「住所」という項目があるとします。 このデータを取得し、画面に表示する際に、「住所1」「住所2」とに分割して、 セットします。 この場合、ファイル上の「住所」は、キャラクタタイプで40バイトと定義されており、 ”半角/全角文字混在”でデータが格納されています。 画面上の、「住所1」「住所2」はそれぞれ、20バイトとします。 この様な条件で、単純に取得したデータを2分割すると、 取得したデータが、全て半角か全角なら問題はないのですが、 例えば、1文字目が半角で、以降が全て全角文字だった場合に、 最後の全角文字がぴったり収まらなくなり、うまく表示できないように思います。 また、文字を取得する際に、使用している、Mid(MidB)関数やLen(LenB)関数も、 うまく利用できていないようです。(コード体系の違いでしょうか?) どなたかご教授下さい。 よろしくお願いします。

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

  • ベストアンサー
  • gokkun
  • ベストアンサー率47% (115/244)
回答No.3

#1で回答した者です。 #1で示したソースプログラムで理解されると思いますが 念のため補足を致します。 ソースプログラムを実行するとシフトJISコード換算で 住所の21バイト目が全角の2バイト目にあたる場合、 address1には19バイト分の文字列、address2には 20バイト目(全角の1バイト目)以降の文字列が格納されます。 例) "123456789全角456789全角・・・" → address1="123456789全角456789" ├─ LenB(work)=21 ─┤      address2="全角・・・"

BAD_LIFE
質問者

お礼

1つめに頂いたご回答とあわせて、ありがとうございました。 サンプルコードまでご提供頂き大変助かりました。 今後もなにかあればまたよろしくお願い致します。

その他の回答 (2)

  • shigatsu
  • ベストアンサー率26% (511/1924)
回答No.2

シフトJISに変換して分割した後に、分割した部分が漢字の第一バイトと第二バイトの間かどうかをチェックしておいた方が良いでしょうね。 単純にバイト数で切ると、文字化けになる可能性があります。

BAD_LIFE
質問者

お礼

ありがとうございました。 参考になりました。

  • gokkun
  • ベストアンサー率47% (115/244)
回答No.1

Mid関数やLen関数は文字単位で処理されますので 全角も半角もそれぞれ1文字として扱われます。 また、MidB関数やLenB関数はバイト単位で処理されますが VB内部ではUnicode仕様になっていて全角も半角もそれぞれ 2バイトとして扱われます。 ですので、次のようにStrConv関数を使って文字列をUnicodeでなく システムの既定のコード体系(通常はSHIFT-JIS)に変換して処理すれば うまく表示することが出来ると思います。 Dim address1 As String, address2 As String Dim work As String Dim ii As Integer For ii = 1 To Len(address) '住所の文字数分繰り返す work = Left(address, ii) '1文字,2文字・・・と順番に住所を切り出す work = StrConv(work, vbFromUnicode) 'Unicodeからシステムの既定のコードに変換 If (LenB(work) > 20) Then '20バイトを超えたらEXIT Exit For 'EXITするとaddress2の先頭文字位置がiiに格納される End If Next ii address1 = Left(address,ii-1) '住所1 address2 = Mid(address,ii) '住所2

関連するQ&A

  • 全角・半角混在の文字列から半角文字のみ取り出す

    エクセル勉強中です。問題集で理解できないところがあります。 数式がどういう意味をもつのか教えて頂けるとありがたいです。 よろしくお願いします。 画像添付の問題になります。 A列に製品名が入っています。(製品番号:半角文字)(製品名:全角文字) B列に半角文字の製品番号だけを取り出しなさいというものです。 半角文字の開始位置がバラバラになっているところが問題のポイントになっています。 回答ですが B2: =MID(A2,MATCH(1,INDEX(LENB(MID(A2,COLUMN(2:2),1))*1,0),),LEN(A2)*2-LENB(A2)) こちらで半角文字のみ取り出せるようです。回答には数式のみで何故この関数を使うのか? 使うことでどういった結果を導くなどの解説が一切ありません。(ちなみに出版会社の便利技的な問題集です) MID関数で製品名A2から開始位置を指定して、全角半角をLEN関数LENB関数で半角文字数を 算出して文字列を抽出するという事は理解できます。 ただ、この開始位置の指定の所が理解できません。 数式を分割してみましたが =MID(A2,COLUMN(2:2),1)の所はどの行も製品名の1文字目ですよね・・・ その値にLENB関数で文字数? 数式の検証で見てみると配列のような結果が次々と現れて・・・ MATCH関数もありますしINDEX関数が何か関係しているような気はしているのですが、 INDEX関数と言えば配列に行番号・列番号と例えば表の該当するセルの位置抽出の 知識しかありません。一つのセルでINDEX関数? すいません。独学で勉強していてこの程度の知識ですが、この数式の考え方教えてくださる方よろしくお願いします。

  • 全角半角混在の文字列から○文字まで取得する方法

    はじめまして! MySQLから取得した文字列をPHPで例えば10文字まで表示したいのですが、良いやり方ありますでしょうか? 文字列には全角半角が混在しているので substr関数だと、うまく取得できない場合があります。よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 全角半角考慮した文字列分割

    A列           B列         C列 あいうえおかきくけこ  あいうえ      おかきくけこ アイウエオカキクケコ   アイウエオカキクケ  コ あいうえオかきくけこ   あいうえオ    かきくけこ A列に全角半角混在のテキスト項目があります。 B列、C列に以下のルールで分割したいのですが、Excel関数で 実現可能でしょうか?可能な場合は式をご教授して 頂けますでしょうか。宜しくお願い致します。 ※全角をバイト数指定で分割して文字化けしないように 全角半角を考慮して分割したいと考えております。 B列  A列9桁目が半角の場合は半角9文字 A列9桁目全角の場合は半角8文字(全角4文字)をB列へ C列  A列10桁目が半角の場合は、左端10桁目~半角9文字 A列10桁目が全角の場合は、左端9桁目~半角9文字

  • 全角半角あわせて3文字

    全角半角が混在している文字列の左から3文字を取得したい場合にいい方法はないでしょうか? mb_substr関数で第3パラメータはバイト数で指定するようです。 関数リファレンスでは「最大文字数」って表現になってます。 http://php.net/manual/ja/function.mb-substr.php 半角なら文字数=バイト数ですが、全角だと指定の半分の文字数になります。 最大だから間違ってはないですが、文字数じゃないよな‥‥っていつも思ってます。 いったん半角→全角にして、6バイト分を切り出すのはできます。 でも、英数字も全角半角混在してるので元の文字列を壊したくないのです。 mb_substrの第3パラメータを6から3まで、mb_strlenが3になるまで回すのもやってみました。 でも、なんかスマートじゃないんですよ‥‥。 なにかこう、スマートないい手はないでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • 全角半角を意識した文字分割

    A列           B列   C列  D列  E列     あいうえおかきくけこ  あ   いう  えお  か アイウエオカキクケコ    アイウ   エオ  カキ ク あイウえオかきくけこ    あ   イウえ  オか き 先ほど同じような質問を一度しているのですが、 A列に全角半角混在のテキスト項目があります。 B列、C列、D列、E列に以下のルールで分割したいのですが、 Excel関数で 実現可能でしょうか? 可能な場合は式をご教授して頂けますでしょうか。宜しくお願い致します。 ※全角をバイト数指定で分割して文字化けしないように全角半角を考慮して分割した いと考えております。 B列(半角3文字)  A列3桁目が半角の場合は半角3文字 A列3桁目全角の場合は半角2文字(全角1文字) C列 (半角4文字) A列4桁目が半角の場合は、左端4桁目~半4文字分 A列4桁目が全角の場合は、左端3桁目~半角4文字 D列(半角4文字) A列7桁目が半角の場合は、左端7桁目~半4文字分 A列7桁目が全角の場合は、左端6桁目~半角4文字 E列(半角2文字) A列11桁目が半角の場合は、左端11桁目~半2文字分 A列11桁目が全角の場合は、左端10桁目~半角2文字

  • 全角半角?

    ACCESS97を使用しています。 次のような文字があります。 4-22 これを4バイトのデータに追加したところ "‐"と"-"によって "4‐2"となります。 "‐"…全角 "-"…半角という意味でしょうか? またStrConv関数で全角⇔半角、大文字⇔小文字をしたのですが 変換できません。 目的は 4‐22 のデータを 4-22 というように変換して 4バイトのところに全て追加できるようにしたいのです。  (数字ではなく "-"横棒を変換) ACCESSで可能でしょうか?

  • 半角全角混在データの中の半角文字だけをJAVAで抽出する方法

    UNICODEでは半角文字も全角文字も2バイト以上で表現 されるらしいので、どうやってすべての半角文字だけを 取り出したらいいか思いつきません。教えてください。

  • エクセルの半角、全角

    エクセルで、半角文字、全角文字が混在するセルを関数等で全て全角にする(半角文字を全角文字に)方法はあるでしょうか?また、文字が1バイト文字か2バイト文字かを簡単に見分ける方法はありますか?

  • substr で全角半角混在の文字列を抜くには…

    全角と半角の混ざった文字列で下のようにすると、1byte文字が混ざったときの最後の1文字が文字化けします。 $kensaku = substr($namae, 0, 10); 原因は分かったので色々なサイトを調べたのですが、頭がついてきません… 全角だけのときは10byte 半角が奇数混じったときは11byte 半角が偶数混じったときは10byte を$kensaku に渡すには どの様な記述をすればいいのでしょうか? 既出の質問で申し訳ございませんが、どうぞ宜しくお願い致します。

    • ベストアンサー
    • Perl
  • 全角文字を半角に変換する

    全角文字を半角へ、またはその半角文字を全角にする 関数もしくは処理がありましたら教えていただきたいの ですが、宜しくお願い致します。 また変換する文字はアルファベットと数字で、漢字とかが 入力されたらエラー表示させる例を提示していただけると たいへんありがたいです。