Определите, является ли текст UTF-8 полностью ASCII?


Каков самый быстрый способ в PHP определить, является ли какой-либо текст UTF-8 чисто ASCII или нет?

Author: philfreo, 2010-11-10

3 answers

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

function isAscii($str) {
    return 0 == preg_match('/[^\x00-\x7F]/', $str);
}

Без регулярного выражения (на основе моего комментария) {

function isAscii($str) {
    $len = strlen($str) {
    for ($i = 0; $i < $len; $i++) {
        if (ord($str[$i]) > 127) return false;
    }
    return true;
}

Но я должен спросить, почему вы так беспокоитесь о быстром? Используйте более читабельную и легкую для понимания версию и заботьтесь о ее оптимизации только тогда, когда вы знаете, что это проблема...

Редактировать:

Тогда самым быстрым, скорее всего, будет mb_check_encoding:

function isAscii($str) {
    return mb_check_encoding($str, 'ASCII');
}
 11
Author: ircmaxell, 2010-11-10 18:52:15

Проверьте, не превышает ли какой-либо байт 0x7f или какой-либо символ выше U+007F.

 3
Author: Ignacio Vazquez-Abrams, 2010-11-10 18:17:44
function isAscii($str) {
    return preg_match('/^([\x00-\x7F])*$/', $str);
}

// doesn't accept ASCII control characters
function isAsciiText($str) {
    return preg_match('/^([\x09\x0A\x0D\x20-\x7E])*$/', $str);
}
 0
Author: philfreo, 2010-11-10 18:30:33