php真正的多字节字符串洗牌函数?

php真正的多字节字符串洗牌函数?,php,multibyte,chars,Php,Multibyte,Chars,我对多字节字符串有一个独特的问题,需要能够在不丢失或重复任何字符的情况下,以一定程度的随机性在PHP中洗牌一个长的UTF-8编码的多字节字符串 在str_shuffle下的PHP手册中,有一个多字节函数(第一个用户提交的函数)不起作用:如果我使用一个字符串,例如所有日语平假名和片假名的字符串长度(ex)都是120个字符,那么返回的字符串是119个字符或118个字符。有时我会看到重复的字符,即使原始字符串中没有。所以这不起作用 为了使这更复杂,如果可能的话,我还需要包括日语UTF-8换行符、换行符

我对多字节字符串有一个独特的问题,需要能够在不丢失或重复任何字符的情况下,以一定程度的随机性在PHP中洗牌一个长的UTF-8编码的多字节字符串

在str_shuffle下的PHP手册中,有一个多字节函数(第一个用户提交的函数)不起作用:如果我使用一个字符串,例如所有日语平假名和片假名的字符串长度(ex)都是120个字符,那么返回的字符串是119个字符或118个字符。有时我会看到重复的字符,即使原始字符串中没有。所以这不起作用

为了使这更复杂,如果可能的话,我还需要包括日语UTF-8换行符、换行符和标点符号

任何有使用UTF-8MB字符串处理多种语言经验的人都能提供帮助吗?PHP是否有任何内置函数来实现这一点?str_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

您需要确保在适当的地方指定编码。

这也应该可以做到这一点。我希望如此

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

}
类字符串
{
公共函数mbStrShuffle($string)
{
$chars=$this->mbGetChars($string);
洗牌($chars);
返回内爆(“”,$chars);
}
公共函数mbGetChars($string)
{
$chars=[];
对于($i=0,$length=mb_strlen($string);$i<$length;++$i)
{
$chars[]=mb_substr($string,$i,1,'UTF-8');
}
返回$chars;
}
}

我喜欢使用此功能:

函数mb_str_shuffle($multi-byte_string=“abcċdđefghijklmnopqrsštuvwxyzž,.-+'*?=)(/&%$#!~ˇ˘{
$characters\u array=mb\u str\u split($multibyte\u string);
洗牌($characters\u数组);
返回内爆(“”,$characters\u数组);//或加入(“”,$characters\u数组);如果你有死亡愿望(JK)
}
  • 将字符串拆分为多字节字符数组
  • 洗牌好人数组,他不在乎他的居民是多字节的
  • 将洗牌数组合并成一个字符串

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

    这正是我想要的。您应该将其包含在PHP str_shuffle页面中。