Должно ли быть что-то вроде «bytelen» (наряду с «strlen»)? - PullRequest
2 голосов
/ 10 марта 2010

По моему мнению, функция 'strlen' должна возвращать только количество символов в строке. Ничего больше. И это делает, считает ли он символы ASCII или символы Unicode. Символ - это символ, указывающий на заданную позицию в таблице ASCII или таблице UTF-8. Ничего больше.

Если по какой-либо причине вы хотите узнать длину строки в байтах, вам следует использовать отличающуюся функцию. Я новичок в PHP-скриптинге, так что пока не нашел эту функцию. (Должно быть что-то вроде 'bytelen ()'?)

Ответы [ 4 ]

1 голос
/ 19 марта 2010

Если я не неправильно понимаю вас, тогда strlen () - это ваш ' bytelen () ', как упоминалосьв других ответах здесь.

strlen () сам по себе не поддерживает utf-8 или другие многобайтовые наборы символов;если вам нужна правильная strlen () , вам понадобится mb_strlen () .

Pentium10 функция strBytes ($ str) , если взглянуть на него (не тестировать), похоже, что это было бы хорошей альтернативой, если вы знаете, что ваша кодировка - utf-8, и по какой-то причине вы застряли в супернизкой версии PHP4.

(И я рекомендую взглянуть на пост Альваро Дж. Викарио по причинам такого поведения. Надлежащая, нативная поддержка UTF-8 должна прийти с PHP6.)

1 голос
/ 10 марта 2010

Да, это был бы самый логичный дизайн. Однако PHP с самого начала не планировал поддерживать многобайтовые кодировки. Вместо этого он развивался годами в хаотической манере. Вы пометили свой вопрос как PHP 4, но PHP 5 пока не имеет достойной поддержки Unicode (и я не думаю, что он изменится в ближайшем будущем).

В любом случае, для этого есть несколько причин:

  • PHP не является коммерческим продуктом с закрытым исходным кодом, принадлежащим компании с централизованным дизайном, контролируемым правилами предприятия.

  • PHP был выпущен в 1995 году как личный проект кем-то, кому нужна была некоторая функциональность на его статической домашней странице: в то время ему не требовалась поддержка Unicode.

  • Если вы модифицируете основные функции, такие как strlen (), вы должны делать это так, чтобы это не нарушало предыдущую функциональность. Это не просто. Написание новой отдельной функции намного проще.

Обновление

Извините, я забыл вторую часть вашего вопроса. Если вам нужно обрабатывать строки Unicode, вы должны использовать отдельный набор функций:

Вы также можете найти эти главы интересными:

Обратите внимание на версию PHP, необходимую для каждой функции, которую вы планируете использовать; PHP 4 довольно старый.

1 голос
/ 10 марта 2010

mb_strlen() делает то, что вы ищете.

0 голосов
/ 10 марта 2010
/** 
     * 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; 
    } 
...