• ベストアンサー

日本語混じりの文字列の語数制限

$str='abcおはようございます。ohayougozaimasu'; を最初から8文字取り出して文字列変数$str0に入れたいのですがどうしたらいいのでしょうか? 日本語と半角文字が混ざっているのできり方を間違えると大変なことになります

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

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

マルチバイト文字列関数(mbstring)が使えれば <?php $str='abcおはようございます。ohayougozaimasu'; echo mb_strcut($str, 0, 8, "sjis"); //8バイト以下で echo "<br>\n"; echo mb_substr($str, 0, 8, "sjis"); //8文字で ?>

guuman
質問者

お礼

ありがとうございます <?= '<?xml version="1.0" encoding="utf-8"?>' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"> <head> <meta http-equiv="content-type" content="application/xhtml+xml; charset=utf-8"/> <title>test</title> </head> <body> <?php $str='abcおはようございます。ohayougozaimasu'; echo $str.'<br/>'; echo mb_strcut($str, 0, 8, "utf-8"); //8バイト以下で echo "<br>\n"; echo mb_substr($str, 0, 8, "utf-8"); //8文字で ?> </body> </html> でできました

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Java String文字列の加工について

    Java String文字列の加工について お世話になっております。 Javaで苦戦しているので、ご指導お願いします!! StringのbeforStrという変数に、 「あああ いいい ううう えええ おおお」 という風に、全角文字の間に半角スペースが入っているとき、 この変数を str1:あああ str2:いいい str3:ううう str4:えええ str5:おおお というように半角スペースで切って、その半角スペースをなくして 各変数に分割したいんですが、どうもうまくいきません。。 お手数ですが、どなたか教えてください!! ちなみに、javaは1.4です。 よろしくおねがいいたします。

    • ベストアンサー
    • Java
  • abcが、入力された文字列内にあるかどうかを表示するプログラム

    文字列strの中にabcが含まれていれば、1を返し、含まれていなければ0を返すプログラムが分かりません。 C言語の問題で下記のものが分かりません。どなたか知恵を貸してください。 ユーザが文字を入力し、CTRL+Zが押されるまで、半角英数字の入力(最大でも1000文字)を受け付ける。文字列「abc」が、入力された文字列内にあるかどうかを表示するプログラムを作成する。ユーザが入力した文字列が3文字未満はabcがありませんと表示させる。 そのプログラム内で以下の関数を完成させる。 int str_srch_abc(char str []) 文字列strの中にabcが含まれていれば、1を返し、含まれていなければ0を返す関数とする。 (例えばabcは連続でabcの時だけ1を返し、asbscなどはoを返します。) ちなみに自分なりにやってみたのですが、ここまでしかできませんでした。 #include<stdio.h> int main() { int str_srch_abc(char str []); char str[1000]; int ch=0, j=0; printf("半角英数字を入力してください"); scanf("%s",str); while((ch=getchar())!=EOF){ str[j]=ch; j++; } str[j]='\0'; printf("%s",str); return(0); }

  • javascriptで文字列の差分を取得

    var str1 = "abc"; var str2 = "abdec"; var str3 = "abcdef"; var str4 = "defgabc"; 元々の文字列文字数固定ではない(例として)「abc」がありまして、 その最初か最後か途中の文字列の間に何かしらの文字列が入る可能性があります。 そのように追加された文字列を割り出したいのですが、 どのようにしたら良いでしょうか?アイディアお持ちでしたらよろしくお願いします。

  • 日本語文字列の正規表現

    いつもお世話になっております。 日本語文字列を含む正規表現で悩んでおります。 【比較対象の文字列】 $str1 = "<select name='se'><option value='あいう'>あいう</option><option value='abc'></option></select>"; 【正規表現で置換させたいところ】 $text = "あいう";//ここの箇所だけoption valueが変わるので変数にいれています。 <option value='$text'>$text</option>という文字列が一致したら <option value='$text' selected>$text</option>にselectedを追加して置換したいのです。 下記内容で作ってみたのですが どの辺りがダメなのか検討がつきません。。 恐らくダメなところだらけかと思うのですが。 分かりづらい説明で申し訳ないのですが どなたかご教授お願いします。 $rep ="<option value='".$text."' selected>".$text."</option>"; preg_replace("/<option\s+[^>]*value\s*=\s*([\'\"]?)".$text."([\'\"]?)\s*w+>".$text."<\s+\/\s+option\s+>/i",$rep,$str1,$str2);

    • ベストアンサー
    • PHP
  • マルチバイト混在の文字列整形

    OS: Linux Ubuntu 言語: C++ 引数でchar*型の文字列配列(マルチバイト含む)を受け取り 指定した幅で枠つきで文字列を出力したいのですがうまくいきません。 作りたい出力 ━━━━━━━ ┃1: あいうえお┃ ┃2: かきく   ┃ ┃3: abc    ┃ ━━━━━━━ - str[] = {"あいうえお", "かきく", "abc"} - あいうえおの後ろは空白なし - 他は空白と文字列を合計してあいうえおと同じ長さに合うように 私の環境では日本語は3byteと認識され  strlen("あいうえお") = 15 となります。 イメージでは for (i = 0; i < strlen(str[])の最大値; i++) { cout << "┃" << i << ":" << setw(15) << left << str[i] << "┃" } のようなコードになると思うのですが 日本語一文字が出力上は2byte分の幅に見えるのに 認識としては3byteになってしまうので空白が1byte多くなり ━━━━━━━ ┃1: あいうえお┃ ┃2: かきく    ┃ ┃3: abc       ┃ ━━━━━━━ のようにずれてしまいます。 (表記上、最初の枠もずれていますが  現状は足りない分を埋めるsetfillが余計に働いてしまうということです。) 何か対策はありますでしょうか?

  • Cシェルで、文字列中(str)に、固定文字列(abc)の数を数える方法

    Cシェルで、文字列中(str)に、固定文字列(abc)の数を数える方法を教えてください たとえば、 set str = abcdabceabcd set abc = abc str中に、abcを現れる数(3)を求める方法を教えてください Cシェルは詳しい方がいらっしゃいましたら、是非教えてお願いいたします

    • ベストアンサー
    • AJAX
  • バッチでfor文で文字列の中身を繰り返したい

    バッチで、for文で、半角スペースやタブ以外で区切られた文字列から、区切り文字毎に 取り出したいのですが、最初の1回しか取り出せません。最後まで繰り返しが行われませ ん。 バッチでは、そもそも、半角スペースやタブ以外では、文字列の中身を繰り返すことは できないのでしょうか。 それとも、他に良い方法があります。 やっていることは、 例えば、 for文で、スラッシュ「/」で区切られた文字列からスラッシュ毎に取り出そうとしている のですが、最初の1回目しか表示されず、最後まで繰り返しが行われません。 以下、色々と試したのですが..... set str=abc/def/ghi/jkl/mno/pqr/stu/vwx/yz for %%a in (%str%) do echo %%a の場合は、 1行そのまま表示されます。(あたりまえです。) for "delims=/" %%a in (%str%) do echo %%a for "delims=/" %%a in ('echo %str%') do echo %%a の場合は、 「"delims=/" の使い方が誤っています。」となります。 for /f "delims=/" %%a in ('echo %str%') do echo %%a の場合は、 最初の1回目の「abc」しか表示されず、そこで処理が終わり、残りが表示されない。 期待している結果は、 これを、 abc def ghi jkl mno pqr stu vwx yz と表示させたい。 set str=abc def ghi jkl mno pqr stu vwx yz for %%a in (%str%) do echo %%a の場合は、 abc def ghi jkl mno pqr stu vwx yz と表示されます。 バッチでは、そもそも、半角スペースやタブ以外では、文字列の中身を繰り返すことは できないのでしょうか。 できる場合、その方法を教えてください。また、他に良い方法がありましたら、教えて下さい。

  • 文字列って何なの?

    ど素人です。ポインタと文字列で躓いています。 まず、以下のようなプログラムをテスト的な意味で作りました。 ****************************************************** #include<stdio.h> int main(void){ char *str = "harehareyukai"; if (str == "harehareyukai"){ printf("haruhi"); }else{ printf("nagato"); } } ****************************************************** これを実行すると haruhi という結果になります。 そこで質問なのですが、*strはポインタ変数として宣言してます。 したがってstrの値は0x10101010みたいな(適当ですが)アドレスが入っているはずです。 なのに何故str == "harehareyukai"が真になるのでしょうか? (自分は最初 *str == "harehareyukai"が真になると思っていましたが違っていました。) というか"harehareyukai"という「文字列」は評価されるとどういう存在になるのでしょうか。 よろしくお願いいたします。

  • PHPで文字列の照合

    文字列の照合で困っています。 二つの変数の文字列が同じかどうかを判定したいのですが、どうもうまくいきません。 マニュアルをよんで、 $judge = strcmp($str1,$str2); で二つの文字列が等しければ$judgeに0が入ると、解釈したのですが、間違っているのでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • Google検索文字列で日本語入れると落ちる

    お世話になります。WinXPで、IE6.01を使用しています。 Google検索文字列で日本語入力ONにして一文字入れると 頻繁にGoogleがかってに終了してしまいます。 かなりの頻度で発生します。 半角英数を一文字入れて、それから日本語入力ONにすると正常に動作します。 日本語入力はIME2003です。 経験のある方ご指導お願いいたします。