2011-09-27 33 views
37

Tôi đang làm một nguồn cấp dữ liệu bất động sản cho một cổng và nó cho tôi biết độ dài tối đa của một chuỗi phải là 20.000 byte (20kb), nhưng tôi chưa bao giờ chạy qua điều này trước đây.Đo kích thước chuỗi theo Byte trong php

Tôi làm cách nào để đo lường kích thước byte của varchar string. Vì vậy, tôi có thể làm một vòng lặp while để cắt nó xuống.

+0

không nên có bất kỳ vấn đề nào nhận được một chuỗi với chiều dài đó là nó có nói gì với bạn không? bạn thấy lỗi gì? – bigkm

Trả lời

25

Bạn phải tìm hiểu xem chuỗi có được mã hóa ascii hay được mã hóa với định dạng nhiều byte hay không.

Trong trường hợp cũ, bạn chỉ có thể sử dụng strlen.

Trong trường hợp thứ hai, bạn cần phải tìm số byte cho mỗi ký tự.

tài liệu strlen đưa ra một ví dụ về cách để làm điều đó: http://www.php.net/manual/en/function.strlen.php#72274

+9

strlen không phải là hàm mb-an toàn và thực sự trả về số byte, không phải ký tự. Nếu bạn muốn số ký tự trong mã hóa nhiều byte, bạn phải sử dụng mb_strlen. –

+11

@Darhazer có thể quá tải 'str *()' thành 'mb_str *()', do đó, gọi 'strlen' thực sự sẽ gọi' mb_strlen'. Để xem nếu điều này được kích hoạt, hãy kiểm tra 'mbstring.func_overload' trong php.ini. Xem thêm http://php.net/manual/en/mbstring.overload.php –

+5

Nếu bạn đang tìm kiếm số lượng ** byte ** (đó là những gì bạn yêu cầu - * không * số ký tự) câu trả lời đúng được đăng bởi @PhoneixS dưới đây; như được chỉ ra bởi @Carlos 'strlen()' không an toàn vì nó có thể bị quá tải trên một số cài đặt PHP. –

18

Bạn có nghĩa là kích thước byte hoặc độ dài chuỗi không?

Kích thước byte được đo bằng strlen(), trong khi chiều dài chuỗi được truy vấn bằng cách sử dụng mb_strlen(). Bạn có thể sử dụng substr() để cắt chuỗi thành X byte (lưu ý rằng điều này sẽ phá vỡ chuỗi nếu mã hóa đa byte - như được chỉ ra bởi Darhazer trong phần nhận xét) và mb_substr() để cắt chuỗi thành ký tự X trong mã hóa của chuỗi.

+3

strlen không cung cấp cho bạn kích thước byte. –

+5

@ N.B.it cung cấp cho bạn chính xác số lượng byte ...đó là lý do tại sao có mb_strlen() trong phần mở rộng mb_. Hãy thử strlen trên ký tự nhiều byte để kiểm tra ... –

+0

@soulmerge nếu bạn sử dụng substr() trên một chuỗi được mã hóa nhiều byte, bạn có thể phá vỡ ký tự cuối cùng trong chuỗi. –

52

Bạn có thể sử dụng mb_strlen() để có được độ dài byte sử dụng một mã hóa mà chỉ có byte-nhân vật, mà không worring về nhiều byte hoặc singlebyte dây. Ví dụ, như drake127 saids trong một chú thích của mb_strlen, bạn có thể sử dụng '8bit' mã hóa:

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

Bạn có thể có vấn đề về sử dụng chức năng strlen từ php có một tùy chọn để quá tải strlen để thực sự gọi mb_strlen. Xem thêm thông tin về nó trong http://php.net/manual/en/mbstring.overload.php

Đối với cắt chuỗi theo độ dài byte mà không chia ở giữa một ký tự multibyte bạn có thể sử dụng:

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

Tiếp tục để PhoneixS câu trả lời cho có được độ dài chính xác của chuỗi trong byte - Kể từ khi mb_strlen() là chậm hơn so với strlen(), cho hiệu suất tốt nhất người ta có thể kiểm tra "mbstring.func_overload" thiết lập ini để mb_strlen() chỉ được sử dụng khi nó thực sự là cần thiết:

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

Hàm strlen() của PHP trả về số ký tự ASCII.

strlen('borsc') -> 5 (byte)

strlen('boršč') -> 7 (byte)

$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 

.. hoặc bạn có thể sử dụng một chức năng như thế này:

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); 
Các vấn đề liên quan