2011-09-27 13 views
37

Robię kanał nieruchomości dla portalu i mówi mi, że maksymalna długość łańcucha powinna wynosić 20 000 bajtów (20kb), ale nigdy wcześniej tego nie robiłem.Zmierz rozmiar łańcucha znaków w bajtach w php

Jak zmierzyć rozmiar byte dla rozmiaru byte o numerze varchar string. Mogę więc zrobić pętlę, aby ją przyciąć.

+0

nie powinno czy jakikolwiek problem z uzyskaniem sznurka na taką długość jest tym, co ci mówi? jakie błędy widzisz? – bigkm

Odpowiedz

25

Musisz dowiedzieć się, czy ciąg znaków jest zakodowany w systemie ASCII lub zakodowany w formacie wielobajtowym.

W pierwszym przypadku można po prostu użyć strlen.

W tym ostatnim przypadku musisz znaleźć liczbę bajtów na znak.

dokumentacja strlen daje przykład, jak to zrobić: http://www.php.net/manual/en/function.strlen.php#72274

+9

strlen nie jest funkcją bezpieczną dla mb i zwraca liczbę bajtów, a nie znaków. Jeśli potrzebujesz liczby znaków w kodowaniu wielobajtowym, musisz użyć mb_strlen. –

+11

@Darhazer możliwe jest przeciążenie 'str *()' do 'mb_str *()', więc wywołanie 'strlen' rzeczywiście wywoła' mb_strlen'. Aby sprawdzić, czy jest on włączony, sprawdź 'mbstring.func_overload' w php.ini. Zobacz także http://php.net/manual/en/mbstring.overload.php –

+5

Jeśli szukasz liczby ** bajtów ** (o co prosiłeś - * nie * liczba znaków) poprawna odpowiedź została wysłana przez @PhoneixS poniżej; jak zauważył @Carlos 'strlen()' nie jest bezpieczny, ponieważ może być przeciążony w niektórych instalacjach PHP. –

18

Masz na myśli rozmiar bajtu lub długość łańcucha?

Rozmiar bajtu jest mierzony przy użyciu strlen(), natomiast długość łańcucha jest sprawdzana przy użyciu mb_strlen(). Możesz użyć substr(), aby przyciąć ciąg znaków do X bajtów (zauważ, że spowoduje to przerwanie łańcucha, jeśli ma kodowanie wielobajtowe - jak zauważył Darhazer w komentarzach) i mb_substr(), aby przyciąć go do X znaków w kodowaniu ciągu.

+3

strlen nie podaje rozmiaru bajta. –

+5

@ N.B.it daje dokładnie taką liczbę bajtów ...dlatego istnieje mb_strlen() w rozszerzeniu mb_. Spróbuj strlen na wielobajtowym znaku, aby przetestować ... –

+0

@soulmerge jeśli użyjesz substr() w wielobajtowym zakodowanym łańcuchu, możesz złamać ostatni znak w łańcuchu. –

52

Można użyć mb_strlen(), aby uzyskać długość bajtowy stosując kodowanie tylko bajt znaków, bez worring o wielobajtowych lub singlebyte smyczki. Na przykład, jak drake127 saids w komentarzu z mb_strlen, można użyć „8bit” Kodowanie:

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

Możesz mieć problemy z używaniem funkcji strlen od php mają możliwość przeciążenia strlen faktycznie zadzwonić mb_strlen. Zobacz więcej informacji o nim w http://php.net/manual/en/mbstring.overload.php

Aby przyciąć ciąg przez bajt długości bez rozłamu w środku wielobajtowego znaku można używać:

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

dalej PhoneixS odpowiedź, aby uzyskać prawidłową długość sznurka w bajtach - od mb_strlen() jest wolniejszy niż strlen(), za najlepsze wykonanie można sprawdzić „mbstring.func_overload” ini ustawienie tak, że mb_strlen() jest używany tylko wtedy, gdy jest to naprawdę konieczne:

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

Funkcja PHP strlen() zwraca liczbę znaków ASCII.

strlen('borsc') -> 5 (bajtów)

strlen('boršč') -> 7 (bajtów)

$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 

.. Można też użyć funkcji takich jak to:

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); 
Powiązane problemy