Должно ли быть что-то вроде «bytelen» (вместе с «strlen»)?

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

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


person Community    schedule 10.03.2010    source источник


Ответы (3)


mb_strlen() делает то, что вам нужно.

person jackbot    schedule 10.03.2010

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

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

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

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

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

Обновлять

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

Вам также могут быть интересны следующие главы:

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

person Álvaro González    schedule 10.03.2010