о строке mb и нормальной строке в PHP - PullRequest
1 голос
/ 05 июня 2010

Как узнать, что строка является строкой mb? поэтому мы используем mb_strlen вместо strlen?

Ответы [ 4 ]

7 голосов
/ 05 июня 2010

Вам необходимо всегда знать, в какой кодировке находится строка и является ли она многобайтовой. В конце концов, вам нужно передать кодировку строки как второй параметр в mb_strlen(), чтобы получить надежные результаты, верно?

Кодировка входящих данных всегда будет определяться каким-либо образом - кодировка страницы при обработке данных формы; кодирование соединения с базой данных и таблиц при обработке данных базы данных; и так далее. Ваша задача - создать поток таким образом, чтобы вы всегда знали, что и в какой кодировке.

Единственное исключение - когда вы имеете дело с произвольными данными третьих сторон, которые не декларируют кодировку своего контента должным образом. Именно тогда (и только тогда) можно использовать функции сниффинга, такие как mb-detect-encoding() и коллеги. Помните, что эти функции очень подвержены ошибкам и могут дать вам только обоснованное предположение о том, в чем заключается кодировка строки, а не надежную достоверную информацию.

2 голосов
/ 05 июня 2010

Сравните результаты strlen и mb_strlen, и, если они не совпадают, строка содержит многобайтовые символы.

2 голосов
/ 05 июня 2010

Нет. Строка - это строка. Невозможно определить, содержит ли он несколько байтов.

Вы можете угадать что-то вроде mb_detect_encoding (), но ваш пробег может варьироваться в зависимости от кодировки и кодировки. Например, UTF-8 имеет очень четкий паттерн, и вы получите очень хороший результат. Но другие кодировки, такие как GB2312, действительно трудно обнаружить.

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

1 голос
/ 05 июня 2010

Разве mb_check_encoding или mb_detect_encoding не предполагается использовать для этого?

...