PHP真正的多字节字符串随机函数?

4

我在处理多字节字符字符串时遇到了一个独特的问题,需要能够在PHP中对长的UTF-8编码的多字节字符串进行随机化,确保不会丢失或重复任何字符。

在PHP手册的str_shuffle下面有一个多字节函数(第一个用户提交的),但它并不起作用:如果我使用一个长度为120个字符的字符串,其中包含所有日语平假名和片假名,返回的字符串可能只有119个字符或118个字符。有时我甚至看到了重复的字符,尽管原始字符串没有这些字符。所以这是不可行的。

更复杂的是,如果可能的话,我还需要包括日语UTF-8换行符、回车符和标点符号。

有没有经验处理多种语言UTF-8 mb字符串的人可以帮忙?PHP是否有任何内置函数可以实现这一点?str_shuffle正是我想要的,我只需要它也可以处理多字节字符。

非常感谢!

3个回答

4
尝试使用 mb_strlenmb_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

在适当的情况下,您需要确保指定编码。


这正是我需要的东西。你应该将它包含在PHP str_shuffle页面中。 - Dave

0

这也应该可以解决问题,希望如此。

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

}

0

我喜欢使用这个函数:

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)
}
  • 将字符串拆分为多字节字符数组
  • 打乱不关心其居民是否为多字节的好人数组
  • 将混洗后的数组合并为一个字符串

当然,我通常不会为函数参数设置默认值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接