• 締切済み

メール本文やBBS投稿文の指定文字幅での自動改行

いつもお世話になっています^^ えっと、やりたいことは、日本語と英語を含む文字列を 指定文字幅で改行したいです。 例えば ---------------------- I'm going to use e-mail to keep in touch with my friends in New Zealand. 私はニュージーランドにいる友人達と疎遠にならないように、電子[mail]利用するつもりです ---------------------- を既に入っている改行は有効のままでオーバーするものを切断するものが欲しいです。 ---------------------- I'm going to use e-mai l to keep in touch wit h my friends in New Ze aland. 私はニュージーランドに いる友人達と疎遠になら ないように、電子[mail] を利用するつもりです. ---------------------- みたいな感じにしたいのですが 2バイト文字?と1バイト文字が混ざってるとなんか? 大変な感じです。 いろいろネットでは探してみたのですが [文字化け] http://www.cubeworks.co.jp/article/index.php?/archives/2-unknown.html なんてのも使ってみましたが、 日本語と英語が混ざっていると改行近辺で文字化けを起こしてしまった。 しょうがないので自分でなにか作ってみようとおもって、自分なりにつくってみました。 ----作った関数------ function str_splits($text,$long,$br="\n",$encode="Shift_JIS"){ $data=explode("\n",$text); foreach($data as $val){ $nagasa=mb_strwidth($val); if($nagasa>$long){ $new[0]=mb_strcut($val,0,$long,Shift_JIS); $new[1]=mb_strcut($val,$long+1,150,Shift_JIS); $val=implode($br,$new); } $last[]=$val; } $mystr=implode("\n",$last); return $mystr; } ------------------- なにが問題かというと 例えば10バイト(半角10文字で分割)で分割すると -------------------------- 123456789山田さん -------------------------- を上の関数で分割すると -------------------------- 123456789 田さん -------------------------- みたいになって「山」の字が消えてしまいます。 この山を消えないようにするには10-11バイトが日本語文字の時は 10バイトから-20バイトで分けないといけないというの思います。 しかし、具体的にどのようにすればスマートにそれができるのかが思いつきません。 是非、ご教授いただければ幸いです。 よろしくお願いいたします。 同様な機能を持つような関数が絶対ニーズがないとは思えないので (でも探したのですが、なぜか無かったです)、そういうソースを公開されているサイトをご存知であれば是非教えていただきたいです。

  • PHP
  • 回答数2
  • ありがとう数2

みんなの回答

回答No.2

自作したものです。 /********************************************************************************/ /* 引 数 1:[str]文字列 */ /* 2:[int]取得する文字列バイト数 */ /* 3:[str]末尾に付加する文字列('…'など/省略可) */ /* 4:[str]改行タグ(コード)置換文字列(省略可) */ /********************************************************************************/ /* 戻 り 値 :[str]文字列 */ /********************************************************************************/ /* 機 能 :マルチバイト対応。 */ /* 文字列(引数1)の先頭から引数2のバイト数だけ文字を取得してリターン。*/ /* 返す文字列長を視覚的にほぼ同じ長さになるようにする */ /********************************************************************************/ function mbLengthAdjustment($str, $len, $foot = '', $nl = ' ') { //int $x; //str $ret = ''; $len = $len - strlen($foot); $str = str_replace("\r\n", $nl, $str); $str = str_replace("\r", $nl, $str); $str = str_replace("\n", $nl, $str); $str = eregi_replace('<BR>', $nl, $str); $str = eregi_replace('<BR />', $nl, $str); $str = eregi_replace('&lt;BR&gt;', $nl, $str); $str = eregi_replace('&lt;br /&gt;', $nl, $str); if( strlen($str) <= $len ) { return $str; } for($x = 0; $x < mb_strlen($str); $x++) { $ret.= mb_substr($str, $x, 1); if( $len <= strlen($ret) ) { break; } } return $ret . $foot; }

widoww
質問者

お礼

3と4引数をいれて関数を使ってみましたが なぜか(?)したあとが消えてしまいます。 $new[1]=mb_strcut($val,$long+1,150,Shift_JIS); の$long+1を$longにしたら理由はよくわかりませんが とりあえずうまくいったので自己解決しました。 ご返答いただき感謝しております。 ありがとうございます。

  • __LINE__
  • ベストアンサー率100% (1/1)
回答No.1

ためしてませんが、以下のサイトは参考になりますか

参考URL:
http://www.cubeworks.co.jp/article/index.php?/archives/2-unknown.html
widoww
質問者

お礼

ありがとうございます。 質問文にもかきましたが・・・ その関数は試しました。 ご返答には感謝しております。

関連するQ&A

  • PHPで指定文字数で切りたい場合

    PHPで、全角と半角の混在した文字列で 全角=1文字、半角=0.5文字として換算した文字数を切り詰めたい場合は どうすれば良いのでしょうか?? 改行コードなどもカウント出来たら尚良いです! 環境は PHPのソースコードはutf-8 入出力はShift-jis ・mb_substrは、半角も1文字とカウントされてしまいます ・mb_strimwidthは、文字幅なので今回は使い物になりません ・mb_strcutはなぜかうまく動いてくれません $str = mb_convert_encoding($str,'shift-jis','utf-8'); $str = mb_strcut($str,0,1000,'shift-jis'); $str = mb_convert_encoding($str,'utf-8','shift-jis'); 500文字になるのを期待したが、出力された文字は512文字になってしまった 全角=1文字、半角=0.5文字の検証は以下のサイトにて行いました http://www.luft.co.jp/cgi/str_counter.php お忙しい中恐縮ですが、 わかる方お教えくださいませ!

    • ベストアンサー
    • PHP
  • Vimで改行コード、文字コードを指定して保存するには

    初歩的な質問です・・・。 操作を覚えたいため、WindowsでVimをはじめました。 Vimで文字コードを指定して保存する操作はできたのですが([ファイル]-[エンコード指定]-[保存]-[(指定の文字コード)])、 改行コードを指定して保存する方法がわかりませんでした・・・。 例えば、Shift-Jis,CR+LFのテキストをVimで開いて、文字を挿入した(編集した)あとに、UTF-8,LFで保存したいのですが・・・。 [ずんwiki - vim] http://www.kawaz.jp/pukiwiki/?vim#of617c72 を、今 参考にしているのですが、よくわかりません・・・。 よろしければ、教えてください。

  • 文字コード変換

    送信元のページがShift_JISの場合は正常に動作するのですが、 UTF-8等の場合は文字化けしてしまいます。 &jcode'convert(*val, 'sjis'); ↑のものを use Encode; Encode::from_to( $val, "UTF8", "Shift_JIS", Encode::XMLCREF ); このように書いたところ、UTF-8も文字化けしないのですが、 コードを自動的に認識して自動で振り分けさせる方法がわかりません。 サーバーのPerlのバージョンは5.8.6です。よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • javaの文字コード変換について

    javaの文字コード変換についての質問ですが 1 shift_jis → jis83 → jis78 2 jis78 → jis83 → shift_jis と変換をかけたいと思っていますがどのようにすれ ばいいのでしょうか? String str = new String( "hogehoge", "XXX" ); でコンストラクタの2つめの引数に変換をかけたい 文字コードの指定をすればうまくいくのでしょうか? もしそうならなんと指定すればいいのでしょうか? 以上よろしくお願いします

    • ベストアンサー
    • Java
  • 半角カナが含まれる文字列をファイル出力

    いつもお世話になっております。 以下のようにしてテキストファイルを出力 していますが、半角カナの出力時に文字化けして しまいます。 ------------------------------------------ FileOutputStream os = new FileOutputStream("D:\\java_src\\test1.txt"); OutputStreamWriter osw = new OutputStreamWriter(os,"Shift_JIS"); BufferedWriter writer = new BufferedWriter(osw); writer.write("テキヨウ"); writer.close(); osw.close(); os.close(); ------------------------------------------ 出力されるテキストファイルは 文字コード:Shift_JIS 改行コード:CRLF としたいのですが何かいい方法はありますでしょうか? 動作環境は WindowsXP + JDK5.0 です。 すいませんが、宜しくお願いします。

  • Shift_JISからUTF-8への変換について

    いつもお世話になります。 UTF-8には4バイト文字がありますが、Shift_JIS(CP932)からUTF-8へ変換する際、 Shift_JISでは2バイトで表わされる文字が、UTF-8では4バイトで表わされてしまう文字はありますでしょうか。 宜しくお願いします。

  • UTF-8 と SHIFT-JIS について

    UTF-8 と SHIFT-JIS について SHIFT-JIS は 半角文字でも全角文字でも 2 バイトとなる UTF-8 は 半角文字でも全角文字でも 1 バイトとなる この認識が正しいかどうかどなたか教えてください!

  • ms_send_mail関数で改行(\n)すると本文に空行が出る

    始めまして。PHP初心者です。 現在PHP5でのms_send_mail関数を使ってメール送信を行う携帯向けページを制作しています。 送信ページでshift_jisへの文字エンコードも問題なく完了し、長い文章も無事に送信・受信していますが、 「\n」を使って改行を命令した部分に受信側で一行分の空行が入ってしまいます。 例えば送信メールの本文に --------------------------------- あいうえお \n かきくけこ \n さしすせそ \n --------------------------------- と記述し、メール送信。それを受信側で見ると ---------------------------------- あいうえお かきくけこ さしすせそ ---------------------------------- と‥行の間に空行が一行入ってしまいます。理想としては ---------------------------------- あいうえお かきくけこ さしすせそ ---------------------------------- と言う風に出力したいんですが‥‥ gooも含め半日ほどネット上を調べたのですが、空行を消す(または入れない)方法がどうしても見つかりません。 この空行を消す方法をご存知のお方がいらっしゃいましたらご教授願えませんでしょうか? 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 改行なしの長文で本文途中から文字化けします。

    よろしくおねがいします。 sendmailを使用しフォームを設置しているのですが 問合せフォームで改行なしで長文を送信された場合 受信した本文途中から文字化けを起こします。 解決方法をネットで探してみたのですが解決する方法が見当たらず 何か対策法があればご教授頂ければ幸いです。 SENDMAILである程度のバイト数を指定し整列させれば・・・的なPAGEをみたのですが 具体的なことが書いてなかったのですが・・・りかきできず。。 よろしくお願いいたします。 ソースの一部はこんな感じです。 sub CopySendmail { # MIMEエンコード $MemberSubject = &mimeencode($MemberSubject); # メールヘッダ $MailHead = "To: $email\n"; $MailHead .= "From: $AdminEmail\n"; $MailHead .= "Subject: $MemberSubject\n"; $MailHead .= "MIME-Version: 1.0\n"; $MailHead .= "Content-Transfer-Encoding: 7bit\n"; $MailHead .= "Content-Type: text/plain\; charset=\"ISO-2022-JP\"\n\n\n"; jcode::convert(\$MemberBody, 'jis', 'sjis'); $MemberBody .= "\n".$MailBody1; open (MAIL, "| /usr/sbin/sendmail -t -f $AdminEmail") || die ("$!"); print MAIL $MailHead; print MAIL $MemberBody; close(MAIL); }

    • ベストアンサー
    • CGI
  • 【C#】StreamReaderクラスのエンコード

    こんばんは。 .NetFramework1.1のStreamReaderクラスを使用して、csvファイルを読み込んでいるのですが、 エンコードでShift_JISを指定しても、"€"などの環境依存文字がそのまま取得されてしまいます。 Shift_JISに存在しない文字は文字化けして取得されるものだと思っていましたが、違うのでしょうか? DBの文字コードがShift_JISなのでこのままDBへ渡すとエラーになってしまい困っています。 ご教授下さい。宜しくお願いします。 -- ソース ---------------------------------------------- StreamReader sr = new StreamReader(path,Encoding.GetEncoding("Shift_JIS")); string str = sr.ReadLine();

専門家に質問してみよう