• ベストアンサー

半角と全角が混ざった文字列のバイト処理に関して

fantomの回答

  • ベストアンサー
  • fantom
  • ベストアンサー率31% (30/94)
回答No.2

ちょっと作ってみました。 文字列を1行目と2行目で分ける関数です。 末端のバイトコードで全角チェックをしています。 全角の場合は末端文字の手前で改行コードをいれています。 これでどうでしょうか? -----使用例----- Dim s2 As String '※↓全角表示されていますが半角文字のイウエです MsgBox "1行目:" & Separate("あイウエお", 6, s2) MsgBox "2行目:" & s2 ----------------------------- Public Function Separate(strtxt As String, lim As Integer, ByRef strtxt2 As String) As String '第1引数:対象文字列 '第2引数:1行目に表示可能なバイト幅 '第3引数:2行目に出力される文字列 '戻り値:1行目に出力される文字列 Dim rec() As Byte, cr() As Byte, send() As Byte, leave() As Byte Dim i As Integer '対象文字列をバイト配列に変換 rec = StrConv(strtxt, vbFromUnicode) '改行コードをバイト配列に変換 cr = StrConv(vbCrLf, vbFromUnicode) ReDim send(UBound(rec) + 1) As Byte For k = 0 To lim - 2 send(k) = rec(k) Next '末端文字が全角かどうかチェック If (rec(lim - 1) >= &H81 And rec(lim - 1) <= &H9F) Or (rec(lim - 1) >= &HE0 And rec(lim - 1) <= &HFC) Then '末端が全角の場合 '改行コード挿入 send(lim - 1) = cr(0) send(lim) = cr(1) '残りの文字挿入 For k = lim - 1 To UBound(rec) ReDim Preserve leave(i) As Byte leave(i) = rec(k) i = i + 1 Next Else '末端が全角じゃない場合 send(lim - 1) = rec(lim - 1) '改行コード挿入 send(lim) = cr(0) send(lim + 1) = cr(1) '残りの文字挿入 For k = lim To UBound(rec) ReDim Preserve leave(i) As Byte leave(i) = rec(k) i = i + 1 Next End If '第2行目の文出力 strtxt2 = StrConv(leave, vbUnicode) '第1行目の文出力 Separate = StrConv(send, vbUnicode) End Function

noname#15844
質問者

お礼

回答有難う御座いました~。 わざわざソースまで記述してもらって感謝です^^ まだそこまで沢山試してないですが、上手く出来ているみたいです。

関連するQ&A

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

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

    • ベストアンサー
    • PHP
  • <word>全角数字を半角にするには?

    オフィスXPを使っています。 全角の数字を半角に一括して変換する方法を探しています。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=708059 を参考にしながらやってみたのですが ”英数字設定”の項目が見当たりません。 どうすればこの項目が出るのでしょうか?

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

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

    • ベストアンサー
    • Perl
  • Excel-VBAで、Loop処理させるセルの範囲を指定したい

    わたしが http://oshiete1.goo.ne.jp/kotaeru.php3?q=2222401 に示したマクロですと、 1行目から100列×100行の範囲を塗られてしまいますが、 【5行目から】、100列×100行を塗らせるように するには、どのように書き換えたらよいでしょうか。 よろしくお願い致します。

  • &(半角アンド)が含まれる文字列の分割

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=644082 質問したものです。 &が%26なのはわかったのですが、それを分割する術がわかりません。 ただ普通にsplitでやってしまうと意図しない&で切れてしまいます。 どのようにしたらいいですか?

    • ベストアンサー
    • Perl
  • CString型 全角半角を意識せずに「1文字」ずつ取り出す

    CString型の文字列に格納されている文字を1文字ずつ取り出したいです。 ただし半角なら1バイト単位で、全角なら2バイト単位で、という風に分離したいです。 半角だけなら、str[0] str[1]...という風に取り出せますが、 全角が混じっていると、1バイト目、2バイト目と分離されてしまいます。 その文字が半角か全角かを判断して、半角なら1バイト、全角なら2バイト同時に取り出すロジックを、下記のような感じの関数として作りたいです。 CString ripString(CString str,int index){ //ソースとなる文字列、n文字目 /*~処理~*/ return 文字列; } たとえば"あaいbうcえdおe"という文字列を入れると、 CString str="あaいbうcえdおe"; ripString(str,0) →結果 "あ" ripString(str,1) →結果 "a" ripString(str,2) →結果 "い" ripString(str,3) →結果 "b"  ・  ・  ・   こういうことをするのに良い方法はありますか? 1バイトごとのそれぞれの文字自身が、 ・半角文字なのか ・全角文字の前1バイトなのか ・全角文字の後1バイトなのか これをプログラム的に判別する方法があればいいのですが・・・悩んでいます。

  • バイトに慣れるまで

    先程http://oshiete1.goo.ne.jp/kotaeru.php3?q=1968599の質問をしたものです。 バイトに慣れるまで普通どの位かかりますか?また、いつごろまでに覚えられないと経営者・バイト仲間に軽蔑されますか?今日からの勤務なので分からないことだらけなんです。今日はなんとか無難に終えれましたが、最後の店閉めの手順がよくわかりませんでした。また、レジもまだ教わっていません。1回教わって理解できなかったことはまた聞くべきですか?それとも、1回で理解できん奴は不要ですか?http://oshiete1.goo.ne.jp/kotaeru.php3?q=1832984上の質問にも目を通して回答して欲しいです。 決して手は抜きません! http://oshiete1.goo.ne.jp/kotaeru.php3?q=1651653でも質問しましたが、不器用なのは相変わらずです。エプロンは問題なかったですが。

  • 全角半角考慮した文字列分割

    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文字

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

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

    • ベストアンサー
    • PHP
  • 文字化け

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=509056 の質問みたいに どうして文字化けは起こるのでしょうか?