• ベストアンサー

日本語(マルチバイト)でのwordwrap処理

簡易メーラーのようなものを作っており、返信の際に改行と”>”が入る処理をしたいと思っています。 しかし、wordwrapを使って分割しようとすると、文字列の途中に半角文字が奇数個入っている場合、その後の文字が化けてしまいます。 mb_splitという関数がありますが、これはまだ実験段階ということなので、今の時点での利用は避けたいと思っています。他のマルチバイト関数を一通り見てみましたが、mb_split以外にwordwrapのような機能は無いように見えました。 どのようにすれば日本語で自動改行処理ができますでしょうか。ご教授下さい。宜しくお願いします。

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

#末尾を(なるべく)揃えるバージョン #$line は、一行分のデータが文字列で入っている $n=10; # 改行させる(半角での)文字数 for($i=0;$i<mb_strlen($line);$i+=$len){ for($j=1;$j<=$n;$j++){ $wk=mb_substr($line,$i,$j); if(strlen($wk)>=$n) break; } $len=mb_strlen($wk); print ">$wk\n"; }

dokumori
質問者

お礼

ありがとうございます!大変助かりました。 やっぱり一つの関数でさっくり処理するわけには行かないんですね。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

回答No.4

単純に行頭に">"を挿入するのであればNo3さんのような処理でいいと思います。 ただ、「実験的なステータス」だからmb_splitを使わないというのであれば、マルチバイト関係の関数は全部コレなので、あまり気にしなくていいと思いますよ。phpの場合、実験的なステータスじゃなくてもバージョンアップの時に挙動が変わる事があるので(^^;あまり気にせず、使える関数ならバンバン使ってます。

dokumori
質問者

お礼

>実験的なステータスじゃなくてもバージョンアップの時に挙動が変わる事があるので 知りませんでした。おっそろしいですね。;´∀` うーん、今後、mb系はあまり積極的に使わないようにします。 有用な情報ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

#1デス >を忘れてました。 print ">" . mb_substr($line,$i,$n) . "\n";

全文を見る
すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

#$line : 一行分の入力 #$n : 改行させる文字数 for($i=0;$i<mb_strlen($line);$i+=$n){ print mb_substr($line,$i,$n) . "\n"; } みたいな感じでどうでしょう。 後ろがそろわないからダメかな・

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 続:日本語(マルチバイト)でのwordwrap処理

    日本語の文字列を、任意の字数で折り返す処理を行おうとしています。先にBLUEPIXYさんから以下のコードを頂きました。 ■■ #$line は、一行分のデータが文字列で入っている $n=10; # 改行させる(半角での)文字数 for($i=0;$i<mb_strlen($line);$i+=$len){ for($j=1;$j<=$n;$j++){ $wk=mb_substr($line,$i,$j); if(strlen($wk)>=$n) break; } $len=mb_strlen($wk); print ">$wk\n"; } ■■ このコードは美しく動くのですが、一つだけ問題があります。文中に改行が入っている場合に、改行後の文字列先頭に">"を付加する処理がないので、改行のある文章は、以下のように表示されてしまいます。 処理前の文字列: 1234567 890 処理後の文字列: >1234567 890 この"890"の手前にも">"を挿入するように、頂いたコードを変更してみました。こんな感じでやれば改行("\n")が拾えると思ったのですが。。。 ■■ for($i=0;$i<mb_strlen($message);$i+=$len){ for($j=1;$j<=$crlf;$j++){ $wk=mb_substr($message,$i,$j); //追加部分↓ $crlfChk=mb_substr($message,$i+$j,1); if($crlfChk=="\n") break; //追加部分↑ if(strlen($cnt)>=$crlf) break; } $len=mb_strlen($wk); print ">$wk\n"; } ■■ 追加部分の拾い方が間違っているのかな、と思うのですが、正解が分かりません。それとも、どこか別の部分が根本的に間違っているのでしょうか。(ローカルの環境はSJISなので、mb関数が正しく動作していないとか。。。?) どなたかご教授頂ければ幸いです。よろしくお願いします。

    • ベストアンサー
    • PHP
  • VC++で日本語(マルチバイト)ファイルの読み込み

    VC++で日本語(マルチバイト)の文字が含まれているファイルを読み込もうと思っています。 例えばunicodeのファイルとして下記の内容があるとして、 11111 abcdef いろはにほへと このファイルから1文字ずつ読み込みたいのですが、ヘルプで調べたところfgetwc関数でマルチバイトの読み込みができるということを調べました。 ファイルのオープンは_wfopenを使用しているのですが、テキストモード・バイナリモードでどちらで開いても、fgetwc関数の戻りはファイルを1byte読んだ結果を返します。 半角文字の場合は"1"とか"a"を単純に呼んで、マルチバイト文字であれは"い"とか"ろ"というデータを読み込みたいのですが、どうすればいいでしょうか?

  • CSVファイルの文字項目に改行コードが存在する場合

    CSVファイルの文字項目に改行コードが存在する場合 2つほど質問したいことがあります。もしよろしければアドバイス頂けると嬉しいです。 1つ目 javaでcsvファイルを読み込んで分割したいと思っています。 単純に考えればセパレータ(ここではカンマにしたいと思います)でsplit関数で済むのですが、いくつか特殊?な要件があります。 1.文字項目は"で囲まれる(例:123,"abc",456) 2.文字項目に改行コードが含まれる場合がある。 3.文字項目に"がある場合は""となる。 (4.文字項目に,がある場合は,,となる。)←ここは未確定になります。確定したら別途質問させて頂きたいと思っています。 特にいま気にしているのは2です。 改行コードが含まれているので、普通にファイルを1行読み込んでも途中までしか取得できないと想定しています。 改行が含まれている場合、2行以上(複数の改行の可能性)が1行分なのですが、どのように処理すればよいのか困っています。 2つ目 読み込んだデータをDB(DB2)に登録するのですが、改行コード込みで登録したいと思っています。1つ目の処理と絡んでどのようにすればうまくいくか悩んでいます。 よろしければアドバイス頂けないでしょうか。

    • ベストアンサー
    • Java
  • 画像処理での文字の処理について

    formのtextareaから文字を受け取り、その文字を画像に書き込むプログラムを作成しています。 処理手順は、 1.[a.php]にあるtextareaに文字を入力   <textarea name="intxt" rows="10" cols="30"></textarea> (FORMのmethodはPOST)    2.submitで値を送信し、[b.php]で処理   [a.php]:print "<img border='0' src='b.php?imgfile=$imgfile&txt=$txt'>";      [b.php]:$imgfile=$_GET['imgfile'];/*画像*/        $txt=$_GET['txt'];    /*入力文字*/        文字を画像に書き込むときに、  aaa  bbb という風に画像に書き込みたいのですが、処理をすると  aaabbb  となります。 そこで私が考えた方法は、改行コードで文字列を切り取り、【 $text=explode("\n",$txt); 】 for文で書き込むという方法でしているのですが、うまく文字列を切り取れません。 改行コードが間違っているのでしょうか? それとも、改行コードでは切り取れないのでしょうか? 検索をかけてみたり、他の質問を見てみたのですが、うまく出来ませんでした。 それと、日本語で文字列を渡すためにはどのような関数を使えばよいのでしょうか? マルチバイト文字列はrawurlencode()を噛まさねば渡すことが出来ないというのはわかったのですが、 どういう風に噛ませるのかわかりません。 いろいろと試したのですが、表示されませんでした。 他にも方法があるのでしょうか? 開発環境は、PHP5.2.5、Apache2.2、WindowsXPです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • マルチバイト文字の大文字、小文字を区別せずに置換

    ある文章に対して、フォームから入力された文字の部分の色を変えて表示するという事をしたいです。 フォームから入力された文字列が[php]として、 php、PHP、Php、phP、php、PHP、Php…など、全角、半角、大文字、小文字関係なく色を変えたい場合、 半角の文字列はeregi_replace()でできると思うのですが、全角の場合はどのように記述すれば良いのでしょうか。 フォームから入力された文字列を全角に変換してmb_eregi_replace()を行ってみたのですが、うまくいきませんでした。 文章を半角に変換すればできるとは思いますが、出来る限りそれはしたくありません。 特に一つの関数で…という事は考えていません。 何か良い方法がありましたらアドバイスをお願い致します。

    • ベストアンサー
    • PHP
  • フォームからの値が日本語かどうかの判別法

    フォームから渡された文字列データが ・全角文字のみで構成されているかどうか ・半角カナのみで構成されているかどうか を判別するにはどのようにすればよいでしょうか。 mb_string系にそれらしい動作をする関数はありますか? ちなみにPHP Version 4.3.3です。 よろしくおねがいいたします。

    • 締切済み
    • PHP
  • 強制改行をしないメーラーを望む

    質問「No.1004799」を発した結果、Outlook Express6では、最高で半角132文字毎に強制改行されてしまうことがわかりました。和文で66文字ですから、PCから携帯へ発信する際、これでは困るのです。 強制改行せず、ベタ打ちイメージのまま送信できるメーラー、或いは改行を半角512文字まで設定できるメーラーをご存知の方、ご推薦ください。 できればNetscapeを望むのですが、詳細設定まではわかりません。 よろしくおねがいします。

  • ""で囲まれていない箇所にある空白で分割

    改行を含まない文字列を以下の制約を満たすように空白で分割したいのですが、preg_splitで一発で分割できるような正規表現ってあるでしょうか。  "" で囲まれる中の空白は分割しない 別の手法として、  1."" 中の空白をいったん別の文字に変換  2.explode(' ', ~) で分割  3.分割した各要素について空白を復元 の3段階を踏めば可能ではあるのですが、もっとスマートにいかないものでしょうか。 〔例〕 $str = 'a:"aaaa" b:"bbb" c:"ccc ccc" d:"eeee"'; を処理した結果、 a:"aaaa" b:"bbb" c:"ccc ccc" d:"eeee" に分割される.

    • ベストアンサー
    • PHP
  • VBA split(文字列, ★) ★←複数デリミタ指定することできますか?

    VBAのsplit()関数ですが、 デリミタは1つしか指定できないのでしょうか? 例えば、 ------------------ 2005-5/23 19'02"40 ------------------ のような文字列を Perlの様に簡単に分割することは無理でしょうか? Array = split(文字列, /[ :\/\'\"-]/)

  • Excel97 VBA とVBSのsplit関数

    新しい職場で、Excel VBAでデータを取り込み、それを改行文字ごとにsplit関数で区切って配列に入れようとしました。 arr=split(文字列,vbcrlf) って感じでですね。しかし、なんとその職場のExcelのバージョンが97のため、VBAでsplit関数が使えず、この意図が実現できませんでした。そのため、ネットで調べてVBScriptのsplit関数を流用しようとしたのですが、「終了していない文字列型の定数です。」とエラーが出てしまいます。ソースは次のとおりなのですが、どう直せばいいでしょうか。改行文字で区切るのでなく、カンマなどで区切るのなら、上手く出来るのですが・・・。 Sub sample() Dim vs As Object Dim rtn As Variant Dim q As String Dim buf As String q = Chr$(34) 'ダブルクォーテーション Set vs = CreateObject("ScriptControl") vs.Language = "VBScript" 'Excel97のVBAにはsplit関数がないのでVBSからsplitを流用 buf = "1" & vbCrLf & "2" & vbCrLf & "3" '改行で区切った文字。実際は、もっと複雑な文字を取り込みます。 rtn = vs.Eval("split(" & q & buf & q & ", vbCrLf)") 'Excel97のVBAにはsplit関数がないのでVBSからsplitを流用 Debug.Print rtn(1) 'ここで「終了していない文字列型の定数です。」エラーが出る End Sub

内蔵マイクが使用できない
このQ&Aのポイント
  • Zoomで内蔵マイクが機能しないときの対処方法は?
  • NEC 121wareのWindows版で内蔵マイクが使えない場合の解決策
  • 内蔵マイクが機能しない問題を解決する方法とは?
回答を見る