web-dev-qa-db-ja.com

PHPでバイト単位の文字列サイズを測定する

私はポータルの不動産フィードを行っており、文字列の最大長は20,000バイト(20kb)である必要があると言っていますが、これに遭遇したことはありません。

varchar stringbyteサイズを測定するにはどうすればよいですか。そのため、whileループを実行して、それを削減できます。

51
Liam Bailey

文字列がASCIIでエンコードされているか、マルチバイト形式でエンコードされているかを把握する必要があります。

前者の場合、strlenを使用できます。

後者の場合、文字ごとのバイト数を見つける必要があります。

strlenのドキュメントには、その方法の例が記載されています。 http://www.php.net/manual/en/function.strlen.php#72274

29
Foo Bah

Mb_strlen()を使用すると、マルチバイト文字列またはシングルバイト文字列を気にせずに、バイト文字のみを持つエンコーディングを使用してバイト長を取得できます。たとえば、drake127がmb_strlenのコメントで述べているように、「8ビット」エンコーディングを使用できます。

<?php
    $string = 'Cién cañones por banda';
    echo mb_strlen($string, '8bit');
?>

Phpには、strlenをオーバーロードして実際にmb_strlenを呼び出すオプションがあるため、strlen関数を使用すると問題が発生する可能性があります。詳細については http://php.net/manual/en/mbstring.overload.php をご覧ください

マルチバイト文字の途中で分割せずにバイト長で文字列をトリムするには、次を使用できます。

mb_strcut(string $str, int $start [, int $length [, string $encoding ]] )
64
PhoneixS

バイトサイズまたは文字列の長さですか?

バイトサイズは strlen() で測定されますが、文字列の長さは mb_strlen() を使用してクエリされます。 substr()を使用して、文字列をXbytesにトリミングできます(マルチバイトがある場合、文字列が壊れることに注意してください)エンコーディング-コメントでDarhazerが指摘したように)およびmb_substr()は、文字列のエンコーディングでX文字にトリミングします。

23
soulmerge

PHPの strlen() 関数は、ASCII文字の数を返します。

strlen('borsc')-> 5(バイト)

strlen('boršč')-> 7(バイト)

$limit_in_kBytes = 20000;

$pointer = 0;
while(strlen($your_string) > (($pointer + 1) * $limit_in_kBytes)){
    $str_to_handle = substr($your_string, ($pointer * $limit_in_kBytes ), $limit_in_kBytes);
    // here you can handle (0 - n) parts of string
    $pointer++;
}

$str_to_handle = substr($your_string, ($pointer * $limit_in_kBytes), $limit_in_kBytes);
// here you can handle last part of string

..または、次のような関数を使用できます。

function parseStrToArr($string, $limit_in_kBytes){
    $ret = array();

    $pointer = 0;
    while(strlen($string) > (($pointer + 1) * $limit_in_kBytes)){
        $ret[] = substr($string, ($pointer * $limit_in_kBytes ), $limit_in_kBytes);
        $pointer++;
    }

    $ret[] = substr($string, ($pointer * $limit_in_kBytes), $limit_in_kBytes);

    return $ret;
}

$arr = parseStrToArr($your_string, $limit_in_kBytes = 20000);
5
mIFO

PhoneixSの答えに加えて、文字列の正しい長さをバイト単位で取得します-mb_strlen()strlen()よりも遅いため、最高のパフォーマンスを得るには、[mbstring.func_overload] ini設定をチェックしてmb_strlen()は、本当に必要な場合にのみ使用されます。

$content_length = ini_get('mbstring.func_overload') ? mb_strlen($content , '8bit') : strlen($content);
3
Ulver