質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.90%

カッコ内の数字の意味とは

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,630

score 481

下記のソースで既存の変数を配列で返すメソッドを利用し、var_dump()で返ってきたものを表示しております。
例えば$testだとstring(24) "ええええええええ"のように表示されるのですが、文字列型のあとの(24)は、何を意味する数字ですか。

$test = "ええええええええ";
$b = array(4,5,3,6,3);
$hensu = get_defined_vars();

var_dump($hensu);
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+3

バイト数です。UTF8 ではひらがなは一文字 3 バイトです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/13 17:04

    ご回答有難うございました。unicodeだと3バイトになるのですね。勉強不足で漠然と半角は、1バイト漢字やひらがななどは、2バイトと思っておりました。

    キャンセル

  • 2016/07/13 17:07

    「unicode では」ではありません。「utf8 では」です。
    unicode には色々な規格がありますが、その中で utf8 は、英数字を 1 バイトで表すために、ひらがなや漢字などのバイト数が増えています。

    キャンセル

  • 2016/07/14 00:59 編集

    以下のサイトがわかりやすいです.

    http://una.soragoto.net/topics/9.html

    「Unicode番号」と「UTF-8のバイト列」は別物のようにしか思えませんが,「UTF-16BE(Big Endian)のバイト列」とは絵文字などを除けばわりとそのまま対応している範囲が多いです.

    例えば文字「あ」は

    Unicode番号: 「3042」
    UTF-8: 「e3」「81」「82」
    UTF-16LE: 「42」「30」
    UTF-16BE: 「30」「42」

    となりますね.

    キャンセル

checkベストアンサー

+2

【参考回答】

こちらをお読みください.
マルチバイト文字を扱う際に気をつけること

$string = 'あいうえお';

$chars = [];
foreach (preg_split('/(?<!\A)(?!\z)/u', $string) as $char) {
    $chars[] = [
        'char' => $char,
        'bytes(16進数)' => implode(' ', array_map('bin2hex', str_split($char))),
        'bytes(10進数)' => implode(' ', array_map('ord', str_split($char))),
    ];
}
print_r($chars);

このようにしてみると,どの文字に何が割り当てられているのか一目でわかります.

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/13 20:18

    ご回答有難うございました。重ね重ね申し訳ありませんが、上記のソースは、

    文字列あいうえおが代入された$stringと空っぽの配列が代入された$charsがある。
    $stringを正規表現にかけ、何らかの方法でマッチしたらマッチした部分で分割する。分割したぶんだけforeach文で$charに代入し、
    foreach文内で先ほど宣言していた空っぽの配列が代入されている$charsに、まず添え字がcharの値に$stringを正規表現で分割した$charを代入、
    bytes(16進数)という添え字の値で、先ほどの分割したものが入った$charを配列にし(str_split)、配列内の値全てを16進数表記にして、
    スペース区切りで文字列にする。
    bytes(10進数)は、配列内全てをasciiにして、asciiになった配列を文字列に戻す。

    という認識と、
    上記の正規表現の、(何かしらの0文字から~1文字、小なり、感嘆符、文字列の始まり)(何かしらの0文字から1文字、感嘆符、文字列の終わり)で、これらを包んでいるカッコは、グループ化のためのもの、という認識は、合っておりますか。

    キャンセル

  • 2016/07/14 00:45 編集

    文字列あいうえおが代入された$stringと,空の配列が代入された$charsがある.正規表現を使ってUTF-8文字列とみなして1文字ずつに分解し,$charに代入してループする.ループ内で

    「UTF-8の1文字」

    「UTF-8の1文字をstr_splitでバイトの配列に分解して,各要素をbin2hexで16進数表記文字列にし,更に半角スペースで結合したもの」

    「UTF-8の1文字をstr_splitでバイトの配列に分解して,各要素をordで整数にし,更に半角スペースで結合したもの (自動的に整数型は10進数整数文字列に変換される)」

    の3種類を作り,連想配列にまとめたものを$charsの要素として追加する.

    …という動作です.正規表現に関しては,

    何も書かなければ,任意のバイト境界に一致する
    上記にu修飾子をつけると,任意のUTF-8文字境界に一致する
    \Aは,先頭に一致する
    \zは,終端に一致する
    (?<!X)Yは,前にXが続かないYに一致する
    X(?!Y)は,後ろにYが続かないXに一致する
    (?<!\A)(?!\z)は,先頭と終端を覗いた任意のバイト境界に一致する
    上記にu修飾子をつけると,先頭と終端を覗いた任意のUTF-8文字境界に一致する

    …要するに,PHPにマルチバイト対応のstr_splitが存在していないので,preg_splitで無理やりやってるというわけです.

    キャンセル

  • 2016/07/14 00:49

    なお好みですが

    preg_split('/(?<!\A)(?!\z)/u', $string)



    preg_split('//u', $string, -1, PREG_SPILT_NO_EMPTY)



    array_filter(preg_split('//u', $string), 'strlen')

    でも構いません.個人的に一番上が最も短いのでしっくりきますが.

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.90%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る