• 締切済み

文字列関数をうまく表示させたい

今、文字列関数をしています。参考書通りにしたのですが、ブラウザでは思い通りに表示されません。 <?php $str = "PHPの絵本"; $length = strlen($str); ?> を表示させたいのですが、 <?php $str = "PHPの絵本"; $length = strlen($str); print $length; ?> で良いのではと思って、ブラウザで表示させたのですが、参考書では 「9」が表示されるみたいなのですが、「12」が表示されます。 さらに <?php $str = "PHPの絵本"; $length = mb_strlen($str); ?> も表記させたいのですが、同様に <?php $str = "PHPの絵本"; $length = mb_strlen($str); print $length; ?> と書きこんだのですが、参考書では「6」が出るみたいのなのですが 自分のブラウザでは「12」が表示されます。どうしてなのでしょうか?

  • PHP
  • 回答数2
  • ありがとう数3

みんなの回答

  • tany180sx
  • ベストアンサー率63% (239/379)
回答No.2

PHPが全角・半角の違いでは?? mb_strlenはmb_strlen($str, 'UTF-8')とすれば意図した値になるかと。

kjfcaoi
質問者

お礼

PHPが全角・半角の違いか??についてですが、半角ですね。ここでは間違えて全角にしていますが・・・。 >mb_strlenはmb_strlen($str, 'UTF-8')とすれば意図した値になる>かと。 ありがとうございました。うまくいきました。あとは上の方だけですね。

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.1

扱ってる文字コードが誓うからだね。 その参考書、文字コードがUTF-8なんだけど 動作させてる方はEUC-JPやShift_JISだったりするんじゃない?

kjfcaoi
質問者

お礼

あぁ~そうですね。 参考書がEUC-JPっぽくて、動作環境はUTF-8ですね。 これが原因だったんですね。 ここまではうまく動作していたのですが、バイトの問題になってくると違う表記になるんですかね!? かなり助かりました。ありがとうございました。

関連するQ&A

  • 文字列に関する関数

    現在C言語の勉強をしております。 そこで、以下の関数の作成について質問させてください。 【関数の仕様】 引数の文字列から、'-'(ハイフン)と'P'以降を排除した文字列を返す。 自分なりに作成してみたのですが、コンパイルで警告が出てしまう状況です・・・。 もっとスマートに書けるんだろうとは思っているんですが、精一杯でした・・・。 どなたか教えていただけませんでしょうか? char *getDelStr(char *str) { int len = strlen(str); int count; char targetStr[32]; for(count = 0; count < len; count++){ if(str[count] != 'P'){ if(str[count] != '-'){ strcat(targetStr,str[count]); } }else{ return targetStr; } } return str; } 以上、よろしくお願いいたします。

  • OpenGLを用いた文字列の表示

    OpenGLを用いた文字列の表示に関して質問です。 現在,VisualC++6.0でDLLを作成し,VBA上でモデリングを行うツールの作成をしています。 http://www.natural-science.or.jp/article/20091123143714.php 上記サイトを参考にして文字列の出力はできたのですが, 文字列に色の指定ができなくなってしまいました。 (ツール作成当初はできていました) 文字列を描画している部分のソースは以下のようにしています。 glColor3fv( color ); glRasterPos3fv( pos ); for(int i=0;i<strlen(str);i++){  glutBitmapCharacter( GLUT_BITMAP_9_BY_15 , str[i] ); } もしかしたら,他のところに原因はあるのかもしれませんが, ご存知の方がいらっしゃいましたら, ご教授いただけませんでしょうか。 以上,よろしくお願いいたします。

  • 文字列検索の関数

    PHP初心者です。 今、文字列$strに使われている文字をチェックして、エラーのときはその文字を表示させたいと思っています。 文字列 $strに特定の文字(B,Z,J,O,X,*)が入っていたらエラーで、エラーになった文字を表示させたいと思っています。このとき、使用する関数はpreg_match_allでいいのでしょうか。 今は、下記のように書いています。 if(preg_match_all("/[B,Z,J,O,X,*]/i",$aaseq[$i],$moji[$i])){     ほかに適当な関数あるでしょうか。

    • ベストアンサー
    • PHP
  • C言語の文字列の取り扱いが分かりません

    こんにちは。 C言語で分からないことがあり、質問させていただきました。 学校で、文字列の取り扱いを習いました。 そこで質問なんですが、以下のソースコードをstrcpy , strcat , strcmp , strlen を使わずに書くことってできないですか? 先生に質問したところ、ポインタとかいうのを使うのだそうですが、それを使わずに書くことってできるんですか?もしよろしければお願いします。 以下のプログラムですが、ユーザーから2つの文字列を受けて、そこから4つの文字列関数を使ってみましょう、というやつです。実行結果も貼っておきますね。 #include <string.h> #include <stdio.h> int main(void) { char str1[80], str2[80]; int i; printf("INPUT 1st word-line. : "); gets(str1); printf("INPUT 2nd word-line. : "); gets(str2); /*文字列(word-line)の長さを確認します。*/ printf("%s is %d moji long.\n", str1, strlen(str1)); printf("%s is %d moji long.\n", str2, strlen(str2)); /*文字列を比較します。*/ i = strcmp(str1, str2); if (!i) printf("two word-lines are same length.\n"); else if (i < 0) printf("%s is smaller than %s.\n", str1, str2); else printf("%s is bigger than %s.\n", str1, str2); /*十分なスペースがあるのなら、str2をstr1の最後に結合させます。*/ if((strlen(str1) + strlen(str2)) < 80 ){ strcat(str1, str2); printf("%s\n", str1); } /*str2をstr1にコピーする*/ strcpy(str1, str2); printf("%s %s\n", str1, str2);

  • mb_detect_encoding()関数について

    かなり初歩的な質問かもしれませんが、とあるサイトを参考に、以下のスクリプトを作って文字コードをEUC、 改行コードをLFにして保存し、実行しました。 <?php $str="PHP練習"; print mb_detect_encoding($str); ?> これを実行した結果は、 UTF-8でした。 てっきり保存した文字コードが出力されると思ったんですが違いました。ためしに今度は「$str="PHP練習";」の部分を「$str="PHP";」に してみたらASCIIと出力されました。 さらに今度は「mb_detect_encoding($str);」の部分を、 「mb_detect_encoding($str,"UTF-8");」にして実行したら、 UTF-8と出力されました。 「mb_detect_encoding($str,"SJIS");」にして実行したら、 SJISと出力されました。 あといろいろ$strの中の文字を変えたりしてみましたが、 たまに何も出力されないときもありました。 サイトの説明を見たら、「mb_detect_encoding()関数は、文字列のエンコーディング形式を検出します」と書いてありました。 この「文字列のエンコーディング形式」というのは何によって決まるのでしょうか?

    • 締切済み
    • PHP
  • マクロ(VBA)での文字列操作

    こういうことできますか? Dim str as String str = Cells(1, 10) Length = Find("会計", str) つまり、エクセル上のセル内の文字列を取ってきて、 会計という文字列を含む場所が何文字目か知りたい。 ところが、Find関数か認識されずエラーが出ます。 Searchにしても同じです。 エクセル関数としては使えるのですが、マクロでは使えないのですか?

  • 文字の数え方

     use utf8; を宣言すると、内部に記述されるリテラルにutf8フラグが立てられて、例えばlengthを用いて文字数を数えた場合に、多バイト文字であっても1文字を1とカウントしてくれるそうです。 次のコードでは、文字列の文字数を数えてみました。。   #! /usr/bin/perl   use utf8;   use Encode;   my $str="最初にUTF-8で表示します。次にshift-JISで表示します。";   print length $str;   print "\n";   $str=encode("shiftjis",$str);   print length $str;   print "\n"; 実行結果は以下の通りです。   33   52 文字列がUTF-8の場合は、シングルバイト文字、多バイト文字関係なく1文字で計算するので33文字です。これに対してshift-JISの場合は、多バイト文字を2文字でカウントするので52文字になります。 なるほど。 しかし、次がよく分からないんですけど、   use utf8; をコメントではずすと、その実行結果は以下のようになりました。   71   76 これはどういう計算なのでしょうか?

    • ベストアンサー
    • Perl
  • 文字列の10+10を20と表示したい

    はじめまして。 データーベースのstring型フィールドに10+10と文字列で入っています。 そのままprintで出力すると10+10と表示されます。 そうではなく20とprintで表示するにはどうすればいいのでしょうか。 intval関数やeval関数等自分で思考錯誤したのですが、どうしても、20と表示されません。 どのようにすればいいのか、ぜひ教えてください。

    • ベストアンサー
    • PHP
  • 検索するプログラミング

    C言語の問題で、ユーザが文字列を入力し、半角英数字の入力(最大でも1000文字)を改行があるまで受け付ける。次に、ユーザに検索する文字列(最大でも半角20文字)を入力させ、はじめに入力された文字列内にあるかどうかを表示するプログラムを作成する。配列の外部を参照しないように注意する。そのプログラム内で以下の関数を完成させる。 int str_srch (char str [], char srch_str[]) : 文字列strの中に文字列srch_strが含まれていれば、1を返し、含まれていなければ0を返す関数とする。 このような感じになると思うのですがどなたか分かりませんか? int str_compare(char *s1, char *s2) { //文字列s1の先頭にs2が含まれていれば等しいければ1、 //そうでなければ0を返す //while文を利用して、s2の1文字目からs2がヌル文字になるまで //繰り返し、s1の対応する文字と等しいかどうかチェック //s2の最後の文字まで等しければ、1 //そうでなければ0を返す } int str_length(char *str) { //文字列strの長さを返す } int str_srch(char *str, char *srch_str) { int strlen, srch_strlen; int i,j=0; strlen =str_length(str); //文字列strの長さ srch_strlen =str_length(srch_str); //文字列srch_strの長さ for(i=0;i<strlen;i++){ //strのi文字目からにsrch_strがあるかどうか  j=j+str_compare(&str[i], srch_str) } //jは文字列srch_strが文字列strに何回含まれているか、を表す //jが1より多くなれば1を返し //jが0なら0を返す }

  • PHPのstrcmp関数について

    PHPのstrcmp関数の動きがよくわかりません。 strcmp (PHP 4, PHP 5) strcmp — バイナリセーフな文字列比較 説明 int strcmp ( string $str1 , string $str2 ) この比較は大文字小文字を区別することに注意してください。 パラメータ str1 最初の文字列。 str2 次の文字列。 返り値 str1 が str2 よりも小さければ < 0 を、str1が str2よりも大きければ > 0 を、 等しければ 0 を返します。 ・・・・・・・・・とマニュアルには上記のようにあります。 聞きたい事!▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼ 1 このstr1がstr2より大きいとはどういうことでしょうか? 2 実際に動きを確認するためにstrcmp関数を他のPHPのビルトイン関数で実現できないのでしょうか? 私の想像では、この関数にあたえる二つの引数を10進数に変換して、値の大きさを比較するという方法なのですが・・。 たとえば <?php $str01 = "a"; $str02 = "b"; print strcmp($str01,$str02); print "<br />"; //上記の値は-1がでるためこの場合 $aのほうが$bより小さいことになる。 //$aの値の文字aが小さいとは?どういうことか //私の、ぱっと思いついた方法は、以下のような意味? $str01 = bin2hex($str01); print $str01 ; //16進数でaという値を表すと61がでる print "<br />"; $str01 = hexdec($str01); print $str01; //10進数でaという値を表すと97がでる print "<br />"; //上記を同じく$bに行うと $str02 = bin2hex($str02); print $str02 ; //16進数でaという値を表すと62がでる print "<br />"; $str02 = hexdec($str02); print $str02; //10進数でaという値を表すと98がでる print "<br />"; print "<hr />"; /* 結果、$aは$bより 【小さい】という事なのでstrcmpは-1を返したと・・・。 こういう事をかんがえてみました。 そしてこれは、普通に考えれば a => bという順序なので アルファベット順になります。 しかしこのやり方だと */ $str03 = "aaaaaaa"; $str04 = "bb"; //と上記のような文字列があった場合同じく同じ手順で値をだすと $str03 = bin2hex($str03); print $str03 ; //16進数でaという値を表すと61616161616161がでる print "<br />"; $str03 = hexdec($str03); print $str03; //10進数でaという値を表すと27410143614427489がでる print "<br />"; //上記を同じく$bに行うと $str04 = bin2hex($str04); print $str04 ; //16進数でaという値を表すと6262がでる print "<br />"; $str04 = hexdec($str04); print $str04; //10進数でaという値を表すと25186がでる print "<br />"; /*ただ上記の方法だと、$str03と$str04を比較すると$str04の【bb】という値の方が 小さくなり順序的には bb => aaaaaaとなりアルファベット順にするとこができない。 三つ目の質問 3 アルファベット順にソートしたいとき標準のsort関数を使わずに他のPHPの標準関数の組み合わせでアルファベット順に並び替える 関数はつくれないのか? どなたか、ご意見お聞かせください。 よろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう