php настоящая функция перемешивания многобайтовых строк?

У меня есть уникальная проблема с многобайтовыми символьными строками, и мне нужно иметь возможность перетасовывать с некоторой степенью случайности длинную многобайтовую строку в кодировке UTF-8 в PHP без потери, потери или повторения каких-либо символов.

В руководстве по PHP в разделе str_shuffle есть многобайтовая функция (первая отправленная пользователем), которая не работает: если я использую строку, например, со всеми японскими хираганой и катаканой длиной строки (например) 120 символов, я am возвращает строку из 119 или 118 символов. Иногда я видел повторяющиеся символы, даже если в исходной строке их нет. Так что это не функционально.

Чтобы сделать это более сложным, мне также нужно включить, если возможно, японские символы новой строки UTF-8, переводы строк и знаки препинания.

Может ли кто-нибудь, у кого есть опыт работы с несколькими языками со строками UTF-8 mb, помочь? Есть ли в PHP встроенные функции для этого? str_shuffle - это ТОЧНО то, что я хочу. Мне просто нужно, чтобы он также работал с многобайтовыми символами.

Большое спасибо!


person Dave    schedule 23.03.2011    source источник


Ответы (3)


Попробуйте разделить строку, используя mb_strlen и mb_substr для создания массива, а затем с помощью shuffle, прежде чем снова соединить его вместе. (Редактировать: как также показано в ответе @Frosty Z.)

Пример интерактивной подсказки PHP:

php > $string = "Pretend I'm multibyte!";
php > $len = mb_strlen($string);
php > $sploded = array(); 
php > while($len-- > 0) { $sploded[] = mb_substr($string, $len, 1); }
php > shuffle($sploded);
php > echo join('', $sploded);
rmedt tmu nIb'lyi!eteP

Вы должны обязательно указать кодировку, где это необходимо.

person Charles    schedule 23.03.2011
comment
Это было ИМЕННО то, что я искал. Вы должны включить его на страницу PHP str_shuffle. - person Dave; 24.03.2011

Это тоже должно помочь. Надеюсь.

class String
{

    public function mbStrShuffle($string)
    {
        $chars = $this->mbGetChars($string);
        shuffle($chars);
        return implode('', $chars);
    }

    public function mbGetChars($string)
    {
        $chars = [];

        for($i = 0, $length = mb_strlen($string); $i < $length; ++$i)
        {
            $chars[] = mb_substr($string, $i, 1, 'UTF-8');
        }

        return $chars;
    }

}
person Anthony Rutledge    schedule 11.05.2016

Мне нравится использовать эту функцию:

function mb_str_shuffle($multibyte_string = "abcčćdđefghijklmnopqrsštuvwxyzžß,.-+'*?=)(/&%$#!~ˇ^˘°˛`˙´˝") {
    $characters_array = mb_str_split($multibyte_string);
    shuffle($characters_array);
    return implode('', $characters_array); // or join('', $characters_array); if you have a death wish (JK)
}
  1. Разделить строку на массив многобайтовых символов
  2. Перемешайте массив хороших парней, который не заботится о том, чтобы его резиденты были многобайтовыми
  3. Соедините перетасованный массив вместе в строку

Конечно, обычно у меня не было значения по умолчанию для параметра функции.

person s3c    schedule 17.03.2021