3

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

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

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

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

非常感谢!

4

3 回答 3

4

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

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

于 2011-03-23T20:24:40.523 回答
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;
    }

}
于 2016-05-11T10:15:15.350 回答
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)
}
  1. 将字符串拆分为多字节字符数组
  2. 洗牌不关心他的居民是多字节的好人数组
  3. 将混洗后的数组连接成一个字符串

当然,我通常不会有函数参数的默认值。

于 2021-03-17T15:56:04.357 回答