- 2008-10-07 (火) 17:39
- php
こんなことが必要になった
- 半角カナを含む日本語文字列に対して、10文字以上のときは短縮したい。
- 文字数ではなく幅(バイト数)でそろえたい。
- 短縮した場合は"..."を付与する。
ということで、がんばってやってみた。
mb_strimwidthというマルチバイトに対応した指定した幅で文字列を丸める関数を使う。
string mb_strimwidth ( string $str , int $start , int $width [, string $trimmarker [, string $encoding ]] )
公式はこんな感じ
引き数は、1:文字列、2:開始位置、3:短縮する幅、4:短縮した場合に追加する文字列、5:文字エンコーディング
となっている。
$string = mb_strimwidth($string,0,10,"...");
あれ、これで解決じゃん?
と思ったけどそう簡単にはいかなかった。
どうやら、半角カナを2バイトとして数えたりして、綺麗に同じ幅で短縮されない。
色々しらべてみると、どうもEUC-JPの半角カナとSJISの半角カナは違う文字でEUC-JPの半角カナは2バイト分の幅でカウントされてしまうらしい。
(使ったサーバの内部文字エンコーディングはEUC-JP)
見た目は一緒だけど違う文字ってわけ分からないけど、決まってるからしょうがない。
じゃあSJISとしてやってみればいいじゃんということで、変換してからやってみた。
$string = mb_convert_encoding($string,"SJIS-win","EUCJP-win"); $string = mb_strimwidth($string,0,10,"...","SJIS-win"); $string = mb_convert_encoding($string,"EUCJP-win","auto");
うーん、これでも結果は変わらない・・・。
ここでハマったけど、解決した。
ネックとなっていたのはやっぱり
「EUC-JPの半角カナとSJISの半角カナは違う文字」
ということ!
違う文字だからエンコード変換で相互に変換できない!
じゃあどうしよっかということで悩んで導き出したのがこの方法
EUC-JPの半角カナを一旦全角カナにしてからSJISの半角カナに戻す
これでうまくできた!!
ちなみに半角⇒全角⇒半角にはmb_convert_kanaを使用。
ということで一連のソースはこんな感じです。
$string = mb_convert_encoding($string,"SJIS-win","EUCJP-win"); //EUC-JP⇒SJISに変換 $string = mb_convert_kana($string,"KAV","SJIS-win"); //半角文字列を全角文字列に変換 $string = mb_convert_kana($string,"ka","SJIS-win"); //全角文字列を半角文字列に変換 $string = mb_strimwidth($string,0,10,"...","SJIS-win"); //文字列を短縮 $string = mb_convert_encoding($string,"EUCJP-win","auto"); //SJIS⇒EUC-JPに変換
関連記事
このブログを書いているsayjiroは最近会社を立ち上げました。小さな小さな会社ですが、一緒に働く仲間を探している今日この頃です。
社員が僕しかいない小規模零細企業ですが、自由に楽しく仕事をしつつWebを使って面白いことができればと思ってます。
募集している人物像:向上心がある・Webともの作りが好き(ある程度経験があると嬉しいですが、未経験でもやる気があれば可です)
お仕事内容:Web周り全般。サイト制作やデザイン、システム構築やiPhoneアプリ開発などいろいろです。
働く形態:その人に合わせて応相談(在宅とかでもいいです)
→興味がございましたらこちらからお気軽にご連絡ください!
コメント:0
トラックバック:0
- この記事のトラックバックURL
- http://sj6.org/cut_short_kana_in_width_by_php/trackback/



