アプリ版:「スタンプのみでお礼する」機能のリリースについて

質問があります。
1バイト文字が来ても2バイト文字が来ても
表示時に視覚的に同じ長さを返す関数が作りたいのですがうまくいきません。

$str1 = "あああaあ";
$str2 ="aaaaaaaaa";

function hoge($str)
{
return mb_substr($str, 0, 5);
}

これだと表示した場合に
あああaあ
aaaaa
となってしまいます。

mb_substrをsubstrにすると2バイト文字の途中をsubstrで指定してしまうと文字化けしてしまいます。

何かうまい回避方法はないでしょうか?
よろしくお願いいたします。

A 回答 (2件)

>何かうまい回避方法はないでしょうか?



補足が必要です。
「ああ」と表示したいのですか?
「あああ」と表示したいのですか?
「ああx」(xに任意の文字を指定)としたいのですか?

この回答への補足

失礼しました。
以下のように訂正させていただきます。

$str1 = "あああaあいいいいいい";
$str2 ="aaaaaaaaaabbbbbbbbbbb";
表示文字バイト数:10

表示結果
あああaあ
aaaaaaaaaa

補足日時:2007/08/16 13:08
    • good
    • 0

なんかすごく簡単な方法があるような気がしますが、ぱっとおもいつかない


ので、以下のような方法でどうでしょうか?

<?PHP
$str1 = "あああaあいいいいいい";
print left($str1,10)."<br>";

$str2 ="aaaaaaaaaabbbbbbbbbbb";
print left($str2,10)."<br>";

function left($str,$len){
if(strlen($str)<=$len) return $str;
$str=substr($str,0,$len+1);
$str=mb_substr($str,0,mb_strlen($str,"EUC-JP")-1,"EUC-JP");
return $str;
}
?>
    • good
    • 0
この回答へのお礼

ありがとうございました。
参考にして考えてみました。
こんなのはどうでしょうか?

function hoge($str, $len, $foot = '')
{
 $x;
 $ret = '';

 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;
  }
 }
 $ret.= $foot;

 return $ret;
}

お礼日時:2007/08/16 18:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!