phpで文字列の切り取りが上手く行きません。


例えば、
「あいうえおかきくけこsasiすせsoなにぬねの」
という文字列があり、
ここから「初めの15文字(半角30文字分)」を切り出したいとします。

そこで、mb_substrを使っているのですが、うまくいきません。

「切り出した文字」+「<BR><BR>」として出力した場合、
たぶん日本語の途中で切り出された文字があると、
「あいうえおかきくけこsasiぜBR><BR>」
みたいに、なってしまいます。

うまく、日本語・半角英数字が混ざった文字列から、
「15文字(30バイト)」分を切り出し、web上で使える方法がありましたら、アドバイスをお願いします。

回答の条件
  • 1人5回まで
  • 登録:2007/07/14 23:49:03
  • 終了:2007/07/21 23:50:55

回答(1件)

id:tezcello No.1

tezcello回答回数460ベストアンサー獲得回数692007/07/15 00:45:51

ポイント60pt

ひょっとして、Shift-JIS で書いたスクリプトを内部エンコードが Shift-JIS ではない環境で、エンコードを指示せずに使っていませんか?

うちで実験してみたら、

$str='あいうえおかきくけこsasiすせsoなにぬねの';
$sub=mb_substr($str, 0, 15,'Shift-JIS');
print $sub.'<br><br>';

で、結果は

あいうえおかきくけこsasiす<br><br>

となりました。特に問題ないです。

$sub=mb_substr($str, 0, 15); の場合は

あいうえおかき�

と文字化けします。


phpでスクリプトを書く場合、Shift-JIS は推奨されていない様ですね。perl互換の正規表現を使う場合とか、XML を使う場合とか...

(EUC-JP, UTF-8 などがいいみたいです。)


それでも Shift-JIS を使いたいのなら、

http://jp.php.net/manual/ja/ref.mbstring.php

例 1339. SJIS ユーザ用の php.iniの 設定

を参考に色々と設定を変更されると良いかも知れません。

(Shift-JIS用なのに、内部エンコーディングを EUC-JP に設定にしているのは変な気がしないでもないですが)


僕自身は、UTF-8 を使う事が多い(でもサーバのデフォルトはEUC-JP)なので、

set_magic_quotes_runtime(false);
ini_set('mbstring.http_input', 'pass');
ini_set('mbstring.http_output', 'pass');
mb_language('ja');
mb_internal_encoding('UTF-8');
mb_regex_encoding('UTF-8');

を「決まり文句」として、スクリプトの最初に入れておく事が多いです。

id:onigirin

どうもありがとうございます。

文字コードのミスでした・・・。

決まり文句、いいですね。

UTF-8で書いてるので、決まり文句使わせていただきますね。

2007/07/15 00:58:14
  • id:tobeoscontinue
    文字列のエンコーディングが合っていないのではないでしょうか
    mb_substrは指定がないと内部文字エンコーディングが使用されます。
    >>||
    <?php
    $data = 'あいうえおかきくけこsasiすせsoなにぬねの';
    echo mb_substr($data, 0, 15, "sjis")."<br><br>";
    ?>||<<
    文字列のエンコーディングとmb_substrで指定するエンコーディングが合っていると'あいうえおかきくけこsasiす'が表示されますが、合っていないと変な文字列になります。
  • id:onigirin
    どうもありがとうございます。
    完全に、ズバリその通りでした・・・。

    閉めたいと思いますので、
    ぜひ解答欄に何か書いておいてくださいね!

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません