Nasıl PHP ile UTF-8 dize içinde bayt sayısı buluyorsunuz?

6 Cevap php

Ben bir ASCII ve UTF-8 dize bayt # belirlemek için php.net sitesinden aşağıdaki işlevi vardır:

<?php 
/** 
 * Count the number of bytes of a given string. 
 * Input string is expected to be ASCII or UTF-8 encoded. 
 * Warning: the function doesn't return the number of chars 
 * in the string, but the number of bytes. 
 * 
 * @param string $str The string to compute number of bytes 
 * 
 * @return The length in bytes of the given string. 
 */ 
function strBytes($str) 
{ 
  // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT 

  // Number of characters in string 
  $strlen_var = strlen($str); 

  // string bytes counter 
  $d = 0; 

 /* 
  * Iterate over every character in the string, 
  * escaping with a slash or encoding to UTF-8 where necessary 
  */ 
  for ($c = 0; $c < $strlen_var; ++$c) { 

      $ord_var_c = ord($str{$d}); 

      switch (true) { 
          case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)): 
              // characters U-00000000 - U-0000007F (same as ASCII) 
              $d++; 
              break; 

          case (($ord_var_c & 0xE0) == 0xC0): 
              // characters U-00000080 - U-000007FF, mask 110XXXXX 
              // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 
              $d+=2; 
              break; 

          case (($ord_var_c & 0xF0) == 0xE0): 
              // characters U-00000800 - U-0000FFFF, mask 1110XXXX 
              // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 
              $d+=3; 
              break; 

          case (($ord_var_c & 0xF8) == 0xF0): 
              // characters U-00010000 - U-001FFFFF, mask 11110XXX 
              // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 
              $d+=4; 
              break; 

          case (($ord_var_c & 0xFC) == 0xF8): 
              // characters U-00200000 - U-03FFFFFF, mask 111110XX 
              // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 
              $d+=5; 
              break; 

          case (($ord_var_c & 0xFE) == 0xFC): 
              // characters U-04000000 - U-7FFFFFFF, mask 1111110X 
              // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 
              $d+=6; 
              break; 
          default: 
            $d++;    
      } 
  } 

  return $d; 
} 
?> 

Ancak Rusya ile bu çalıştığınızda (örneğin По своей природе компьютеры могут работать лишь с числами. И для того, чтобы они могли хранить в памяти буквы или другие символы, каждому такому символу должно быть поставлено в соответствие число.). Bu bayt doğru sayısını döndürmek için görünmüyor.

Switch deyimi varsayılan koşul kullanıyor. Herhangi beklendiği gibi Rus karakterler çalışmıyor olmaz neden fikir? Ya da bunun için iyi bir seçenek olacaktır.

Ben bayt belirli sayıda bir UTF-8 dizesi kısaltmak gerekiyor gibi bu soruyorum. yani ben sadece bir max gönderebilirsiniz. (diğer paket verileri hariç) benim durumda iPhone APNS json veri 169 bayt.

Referans: PHP strlen - Manual (Paolo Comment on 10-Jan-2007 03:58)

6 Cevap

strlen () bayt sayısını döndürür.

Bayt belirli sayıda baytlı dize kısaltarak ayrı bir iştir. Bunu kısaltmak gibi bir çokbaytlı ortasında dize kesmek için değil dikkat çekmek gerekir.

Işlemek için gereken diğer bir şey de json gösterimde içine bir dize koyduğumuzda, json olarak temsil etmek için daha fazla bayt gerekebilir olmasıdır. Örneğin, eğer dizge çift tırnak karakteri içeriyor. Bu öncelenmesi gerekir, ve ters eğik çizgi karakter bir bayt katacak. Çok kaçtı gereken diğer karakterler var. Nokta daha büyük alabilirsiniz olduğunu. Ben bayt sınırı toplam json yükü üzerinde olduğunu varsayalım, bu nedenle json sözdizimi kendisi için hesap gerekiyor, hem de herhangi bir bu json kaçan sizin dize getirecektir.

Bunu yapmak için bir unoptimized, biraz hacky yolu dize doğrayın olduğunu, at) (substr kullanarak, sınırdan daha 5 byte daha söylüyor. Şimdi strlen () karakter sayısını almak için kullanmak, ve mb_substr () son karakteri silmek için. Şimdi json olarak kodlamak ve strlen () aracılığıyla bayt ölçün. Mb_substr kullanarak son karakteri (kapalı doğrama tutan bir döngü) girin, json gibi kodlar, ve yine strlen () kullanarak bayt ölçün. Bayt sayısı kabul edilebilir olduğu zaman döngü sona erer.

Eğer mbstring.func_overload 2 ve UTF-8 dizeleri kullanırken çok bayt dize bayt uzunluğunu bulmak isterseniz, o zaman aşağıdakileri kullanabilirsiniz:

mb_strlen($utf8_string, 'latin1');

>

to get the count of byte you can use (php4,5) strlen. to get the unicode string (utf8 encoded) length you can use mb_strlen (take care about function overloading from that extension) or you can simply count all bytes which do not have the 8th bit set.

8 bit bu UnicodeChar girişten en az bir tane daha bayt geliyor için araçlar.