文字の見た目の長さを取得する方法について

このQ&Aのポイント
  • 文字の見た目の長さを取得する方法を探しています。特定の文字で意図した結果を得ることができませんでした。
  • ソースコードを示しています。mb_convert_encodingやmb_strwidthを使用して文字の長さを取得しています。
  • UTF-8の日本語のバイト数が原因かもしれませんが、どうすれば文字の見た目の長さを正確に取得できるのかわかりません。アドバイスがありましたらお願いします。
回答を見る
  • ベストアンサー

文字の見た目の長さを取得する方法について

文字の見た目の長さを取得し、全角■(半角■×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 $array = array( "1234567890" // 1. 10とカウントしたい , "12345" // 2. 10とカウントしたい , "侉侉侉侉侉" // 3. 10とカウントしたい , "※※※※※" // 4. 10とカウントしたい , "112233" // 5. 9とカウントしたい ); for($i=0; $i<count($array); $i++) { // 3がNG echo strlen(mb_convert_encoding($array[$i], 'SJIS', 'UTF-8')); echo "<br />"; // 4がNG echo mb_strwidth($array[$i], 'UTF-8'); echo "<br />"; echo "<br />"; } ?> </body> </html> 【結果】 10 10 10 10 5 10 10 5 9 9 http://hamamuratakuo.blog61.fc2.com/blog-entry-421.htmlのUTF-8の日本語のバイト数が原因かもと思ったのですが、どうすれば文字の見た目の長さを取得できるか分からなかった為、アドバイスいただける方がいらっしゃいましたら、ご教示の程よろしくお願いします。 以上、よろしくお願いします。

  • PHP
  • 回答数4
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
  • JaneDue
  • ベストアンサー率75% (263/350)
回答No.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; }

iroha_168
質問者

お礼

ご回答ありがとうございます。 ご教示いただいたソースで意図した動作となりました。 半角カナについてはどうするか検討してみたいと思います。 <!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> このたびはどうもありがとうございました。 以上、よろしくお願いします。

その他の回答 (3)

  • petita
  • ベストアンサー率53% (8/15)
回答No.3

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>"; }

iroha_168
質問者

お礼

ご回答ありがとうございます。 ご教示いただいたソースでは半角カナの扱いが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% (1621/5656)
回答No.2

>全角を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とし、それを加算しながら文字数分繰り返す。 ということを行う関数をつくればよいと思いますが。

iroha_168
質問者

お礼

ご回答ありがとうございます。 半角、全角の定義についてはNo.4さんの方法で対応しようと思います。 このたびはどうもありがとうございました。 以上、よろしくお願いします。

  • wormhole
  • ベストアンサー率28% (1621/5656)
回答No.1

見た目の長さはフォントあっての話になりますので文字コードだけではわかりません。

iroha_168
質問者

お礼

ご回答ありがとうございます。 表現が悪くて申し訳ありません。 全角を2、半角を1として取得したいと思っております。 以上、よろしくお願いします。

関連するQ&A

  • 前後の全角スペースを削除すると文字化けする

    PHP初心者です。 trimファンクションを使って前後の全角スペースを削除したいのですが $test = " 左右に全角スペースがある文字列 "; echo trim ( $test , " " ); だと問題なく表示されるのですが以下のようにテキストボックスに入力した文字の 前後の全角スペースを削除しようとすると最初の1文字目が文字化けします。 ●test_input.html <!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> </head> <body> <form action="test.php" method="get"> <dl> <dt>文字を入力してください。</dt> <dd><input type="text" name="test" size="50" maxlength="50" id="test" /> </dd> </dl> <input type="submit" value="送信する" /> </form> </body> </html> ●test.php <!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> </head> <body> <p>入力文字</p> <?php $test = ($_REQUEST['test']); echo ($test); ?> <br /> <br /> <p>trim ( $test , " " )</p> <?php echo trim ( $test , " " ); ?> </body> </html> どこがいけないのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • XHTMLのソースで文字ばけします

    とあるHTMLの本に書いてあるとうりソースをうっていくと <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtyd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type"content="text/html;charset=utf-8"/> <title>もりのみや<title/> などのWeb上で文字入力をすると文字化けします。 どうしてでしょうか? インターネットエクスプローラーを使っています。

  • 文字数カウンタにsetIntervalを使うには

    JavaScript初心者です。 JavaScriptで残り入力可能文字数を表示するカウンタを作成したのですが 以下のプログラムだとコピペしたときカウントがされません。 そこでsetIntervalを使ってカウントできるようにしたいのですがどのように 「変数(省略可) = setInterval(関数名,ミリ秒)」 を流用すればよいのかイマイチわかりません。 <!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>   <script type="text/javascript"><!--     function ShowLength( str ) {       document.getElementById("inputlength").innerHTML = 20 - str.length + "文字入力できます";     }   // --></script> </head> <body>   <input type="text" name="title" size="50" maxlength="20" onkeyup="ShowLength(value)"><br /> あと<a id="inputlength">20文字入力できます</a> </body> </html> よろしくお願いします。

  • charsetとフォーム入力文字

    Htmlファイルの先頭が <?xml version="1.0" encoding="UTF-8"?> <!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" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> ・・・ で始まります。 このファイルのフォームに入力した文字はUTF-8で送られるのでしょうか。 それともOSの文字コードに依存するのでしょうか?

    • ベストアンサー
    • HTML
  • PHP、どうして認識しないのですか?

    現在の私のサイト(shtml)のソースは次のとおりです(甲)。これを下記(乙)のように書き換えてアップしましたが”こんにちは”の文字が現れません。 レンタルサーバーの問題ですか?ソースの問題ですか? (甲) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <HTML lang="ja"> <HEAD> <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" > <META http-equiv="Content-Script-Type" content="text/javascript"> <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <META http-equiv="Content-Style-Type" content="text/css"> <META NAME="ROBOTS" CONTENT="INDEX,FOLLOW"> <TITLE>○○○</TITLE> (乙) <!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" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" /> <title>○○○</title> </head> <body> <!--shtmlのソースの中に次を挿入しました--> <p> <?php echo "こんにちは。<br />"; echo "こんにちは。<br />"; echo "こんにちは。<br />"; echo "こんにちは。<br />"; ?> </p> ----------------------- これが表示されません。 教えて下さい。どうしてですか? 宜しくお願いします。

    • ベストアンサー
    • PHP
  • XHTMLの文字コードのEUC-JPの文字化け

    いつもはHTML4.01で作業をしていて XHTMLはどうも不慣れなせいか 今、外注が作成したHPを修正していて 文字コードをEUC-JPにどうしても変更しなければならないのですが それがうまくいかず、文字化けが発生してます。 <!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" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> を <?xml version="1.0" encoding="euc-jp"?> <!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" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=euc-jp" /> このように設定したら文字化けが発生しました。 どのように設定したら文字化けがなくなりますか?

  • クッキー送信

    以下のコードでクッキーが送信できると思ったのですができません。 どこがいけないでしょうか? <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>cookie</title> <script language="javascript"><!-- --></script> </head> <body onLoad="setfocus()"> <?PHP if(!isset($_COOKIE['visited']))// { //はじめての訪問 $count=1; echo"<p></p>"; } else { echo"cookie up<br />"; $count = $_COOKIE['visited']; $count++; } setcookie('visited',$count);// echo "Hello!!<br />"; echo "your ${count} visited!<br />"; echo '<a href="cookie.php">cookie</a>' ?> </body> </html>

    • 締切済み
    • PHP
  • utf-8 文字化け

    メモ帳でhtmlページを作成してたのですが、日本語を入力してIEで確認したら文字化けになります 原因がわからず困っていました よろしくお願いします IE10 IE 表示 エンコードはutf-8 自動選択にすると日本語表示になります <!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>ABC</title> <style type="text/css"> </style> </head> <body> <h1>ようこそ</h1> <p></p> </body>

  • ASP記述式

    今、PHPの勉強をしているのですが・・最初の方でいきなりASPの記述式についてコードが書いていました。物凄く簡単なコードなのですが、下記のコードの中でASP記述式の「はじめまして(*^_^*) 」だけが表示されません。どうしたら表示されるのでしょうか?ご教授よろしくお願いします。 <!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> </head> <body> <p> <b>基本形:</b><br> <?php echo"はじめまして(*^_^*)"; ?> <p> <b>短縮形:</b><br> <? echo"はじめまして(*^_^*)"; ?> <p> <b>スクリプト記述形:</b><br> <script language="PHP"> echo "はじめまして(*^_^*)"; </script> <p> <b>Active Server Page(ASP)式記述:</b><br> <% echo"はじめまして(*^_^*)"; %> </body> </html>

  • XHTML meta属性 文字化け

    XHTMLを勉強しています。 以下のように記述して表示すると タイトルの部分が文字化けします。 何故でしょうか <?xml version="1.0" encoding="utf-8"?> <!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" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Style-Type" content="text/css" /> <meta http-equiv="Content-Script-Type" content="text/javascript" /> <title>ホームページの作り方</title> <meta name="description" content="初心者のためのホームページテスト" /> <meta name="keywords" content="ホームページ,作成,初心者" /> </head> <body> テスト </body> </html>

    • ベストアンサー
    • HTML

専門家に質問してみよう