проверьте, является ли многобайтовая строка в PHP


Я хочу проверить, является ли строковый тип многобайтовым на PHP. Есть какие-нибудь идеи, как это сделать?

Пример:

<?php!
$string = "I dont have idea that is what i am...";
if( is_multibyte( $string ) )
{
    echo 'yes!!';
}else{
    echo 'ups!';
}
?>

Возможно (правило 8 байт):

<?php
if( mb_strlen( $string ) > strlen() )
{
    return true;
}
else
{
    return false;
}
?>

Я прочитал: Кодировка переменной ширины - WIKI и UTF-8 - ВИКИ

Author: Sam, 2013-05-29

4 answers

Существует две интерпретации. Во-первых, каждый символ многобайтовый. Во-вторых, строка содержит по крайней мере один многобайтовый символ. Если вас интересует обработка недопустимой последовательности байтов, см. https://stackoverflow.com/a/13695364/531320 подробнее.

function is_all_multibyte($string)
{
    // check if the string doesn't contain invalid byte sequence
    if (mb_check_encoding($string, 'UTF-8') === false) return false;

    $length = mb_strlen($string, 'UTF-8');

    for ($i = 0; $i < $length; $i += 1) {

        $char = mb_substr($string, $i, 1, 'UTF-8');

        // check if the string doesn't contain single character
        if (mb_check_encoding($char, 'ASCII')) {

            return false;

        }

    }

    return true;

}

function contains_any_multibyte($string)
{
    return !mb_check_encoding($string, 'ASCII') && mb_check_encoding($string, 'UTF-8');
}

$data = ['東京', 'Tokyo', '東京(Tokyo)'];

var_dump(
    [true, false, false] ===
    array_map(function($v) {
        return is_all_multibyte($v);
    },
    $data),
    [true, false, true] ===
    array_map(function($v) {
        return contains_any_multibyte($v);
    },
    $data)
);
 6
Author: masakielastic, 2017-05-23 11:48:44

Я не уверен, что есть лучший способ, но на ум приходит быстрый способ:

if (mb_strlen($str) != strlen($str)) {
    echo "yes";
} else {
    echo "no";
}
 6
Author: periklis, 2013-05-29 18:45:06

Если вы пытаетесь проверить строку, используйте ctype_alpha() функция

$text = 'insert your text here';

if (ctype_alpha($text)){
echo 'it is text';
}else{
echo 'it is not tex';
}
 1
Author: samayo, 2013-05-29 18:46:49

Чтобы определить, является ли что-то многобайтовым или нет, вам нужно уточнить, какой набор символов вы используете. Например, если ваш набор символов Latin1, никакие строки не будут многобайтовыми. Если ваш набор символов UTF-16, каждая строка многобайтовая.

Тем не менее, если вас интересует только определенный набор символов, скажем utf-8, вы можете использовать тест mb_strlen < strlen, если вы явно укажете параметр кодировки.

function is_multibyte($s) {
  return mb_strlen($s,'utf-8') < strlen($s);
}
 1
Author: James Holderness, 2013-05-29 19:43:50