- ベストアンサー
文字の見た目の長さを取得する方法について
- 文字の見た目の長さを取得する方法を探しています。特定の文字で意図した結果を得ることができませんでした。
- ソースコードを示しています。mb_convert_encodingやmb_strwidthを使用して文字の長さを取得しています。
- UTF-8の日本語のバイト数が原因かもしれませんが、どうすれば文字の見た目の長さを正確に取得できるのかわかりません。アドバイスがありましたらお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
面白そうでしたが、厳密にやろうとすると結構面倒ですね。 発想を変えて「 一旦すべて全角とみなして文字数*2 とし、そこから半角定義にヒットした数をマイナスする」でやってみました。 (とりあえず 半角スペースから~までの英数記号を 1 としていますが、半角カナはどうするのか等でpreg_replaceの正規表現を適宜修正下さい。) for($i=0; $i<count($array); $i++) { echo my_strwidth($array[$i])."<br>\n"; } function my_strwidth($str){ preg_replace("/[ -~]/i","",$str,-1,$c); return mb_strlen($str)*2 - $c; }
その他の回答 (3)
- petita
- ベストアンサー率53% (8/15)
mb_strwidth()、mb_strlen() には正しく判定してくれない文字があるようですから、strlen() を使って $strwidth+=strlen($chr)==1?1:2; としてやれば良いじゃないですか。 mb_language("Japanese"); mb_internal_encoding('utf8'); $str=array( "1234567890"// 1. 10とカウントしたい , "12345"// 2. 10とカウントしたい , "侉侉侉侉侉"// 3. 10とカウントしたい , "※※※※※"// 4. 10とカウントしたい , "112233"// 5. 9とカウントしたい ); for($i=0;$i<count($str);$i++){ echo "$str[$i] (",strlen($str[$i])," bytes) "; $strwidth=0; for($j=0;$j<mb_strlen($str[$i]);$j++){ $chr=mb_substr($str[$i],$j,1); $strwidth+=strlen($chr)==1?1:2; } echo "strwidth => $strwidth<br>"; }
お礼
ご回答ありがとうございます。 ご教示いただいたソースでは半角カナの扱いが2となってしまいますね。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>title</title> </head> <body> <?php mb_language("Japanese"); mb_internal_encoding('utf8'); $str=array( "1234567890"// 1. 10とカウントしたい , "12345"// 2. 10とカウントしたい , "侉侉侉侉侉"// 3. 10とカウントしたい , "※※※※※"// 4. 10とカウントしたい , "112233"// 5. 9とカウントしたい , "アイウエオ"// 6. 5とカウントしたい ); for($i=0;$i<count($str);$i++){ echo "$str[$i] (",strlen($str[$i])," bytes) "; $strwidth=0; for($j=0;$j<mb_strlen($str[$i]);$j++){ $chr=mb_substr($str[$i],$j,1); $strwidth+=strlen($chr)==1?1:2; } echo "strwidth => $strwidth<br>"; } ?> </body> </html> そのため、No.4さんのソースを使用させていただこうと思います。 このたびはどうもありがとうございました。 以上、よろしくお願いします。
- wormhole
- ベストアンサー率28% (1626/5665)
>全角を2、半角を1として取得したいと思っております。 何をもって全角or半角としますか? http://ja.wikipedia.org/wiki/%E5%85%A8%E8%A7%92%E3%81%A8%E5%8D%8A%E8%A7%92 処理的には1文字づつ調べて半角として扱いたい文字であれば1 全角として扱いたい文字なら2とし、それを加算しながら文字数分繰り返す。 ということを行う関数をつくればよいと思いますが。
お礼
ご回答ありがとうございます。 半角、全角の定義についてはNo.4さんの方法で対応しようと思います。 このたびはどうもありがとうございました。 以上、よろしくお願いします。
- wormhole
- ベストアンサー率28% (1626/5665)
見た目の長さはフォントあっての話になりますので文字コードだけではわかりません。
お礼
ご回答ありがとうございます。 表現が悪くて申し訳ありません。 全角を2、半角を1として取得したいと思っております。 以上、よろしくお願いします。
お礼
ご回答ありがとうございます。 ご教示いただいたソースで意図した動作となりました。 半角カナについてはどうするか検討してみたいと思います。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>title</title> </head> <body> <?php mb_internal_encoding('utf8'); $array = array( "1234567890"// 1. 10とカウントしたい , "12345"// 2. 10とカウントしたい , "萓我セ我セ我セ我セ・// 3. 10とカウントしたい , "※※※※※"// 4. 10とカウントしたい , "112233"// 5. 9とカウントしたい ); for($i=0; $i<count($array); $i++) { echo my_strwidth($array[$i])."<br>\n"; } function my_strwidth($str){ preg_replace("/[ -~]/i","",$str,-1,$c); return mb_strlen($str)*2 - $c; } ?> </body> </html> このたびはどうもありがとうございました。 以上、よろしくお願いします。