php true многобайтовая функция перемешивания строк? - PullRequest
2 голосов
/ 23 марта 2011

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

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 23 марта 2011

Попробуйте разделить строку, используя 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

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

0 голосов
/ 11 мая 2016

Это тоже поможет.Я надеюсь.

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;
    }

}
...