帮助PHP和多字节字符

时间:2011-03-25 21:53:48

标签: php multibyte

我有一个问题,我认为这很简单,但事实证明它很复杂。

我有一个长的UTF-8字符串,混合了罗马字符,西欧语,日语和韩语字符以及标点符号。许多是多字节字符,但有些(我认为)不是。

我需要做两件事:

  1. 确保没有重复的字符(并输出新的字符串,删除了dupes)。
  2. 随意洗牌新字符串。
  3. (抱歉,我似乎无法将代码引用格式正确...)

    function uniquechars($string) {
        $l = mb_strlen($string);
        $unique = array();
        for($i = 0; $i < $l; $i++) {
            $char = mb_substr($string, $i, 1);
            if(!array_key_exists($char, $unique))
                $unique[$char] = 0;
            $unique[$char]++;
        }
        $uniquekeys = join('', array_keys($unique));
        return $uniquekeys;
    }  
    

    function unicode_shuffle($string)
    {
        $len = mb_strlen($string);
        $sploded = array(); 
        while($len-- > 0) { 
            $sploded[] = mb_substr($string, $len, 1);
        }
        shuffle($sploded);
        $shuffled = join('', $sploded);
        return $shuffled;
    }
    

    使用这两个功能,有人非常有帮助,我想我已经设置好了...除了奇怪的是,它似乎是唯一的字符串(没有重复)和Shuffled字符串不包含相同数量的字符。 (我从浏览器中突出显示这些字符,然后剪切并粘贴到另一个应用程序中...一个字符串总是与上面的字符串不同,但通常会有所不同......它甚至不是相同数量的字符每次都被截断!)。

    对不起,我对PHP知之甚少,也不了解自己的编码,但这里到底出了什么问题呢?似乎很容易将一根长长的绳子洗牌,但显然它比我想象的要难得多。是否有另一种更简单的方法可以做到这一点?我应该首先将字符串转换为相应的十六进制数并将其转换,然后转换回UTF-8?我应该输出到文件而不是屏幕吗?

    有人有建议吗?对不起,我对此很新,所以我可能只是在做一些非常愚蠢的事情。

1 个答案:

答案 0 :(得分:2)

你可以做更简单的事情。

这是一个只获取字符串中唯一字符的函数:

// returns an array of unique characters from a given string
function getUnique( $string ) {

    $chars = preg_split( '//', $string, -1, PREG_SPLIT_NO_EMPTY );
    $unique = array_unique( $chars );

    return $unique;

}

然后,如果您想重新调整订单,只需将唯一字符数组传递给shuffle

$shuffled = shuffle( $unique );

编辑:对于多字节字符,此功能应该可以解决问题(感谢http://php.net/manual/en/function.mb-split.php帮助使用正则表达式):

function getUnique( $string ) {

    $chars = preg_split( '/(?<!^)(?!$)/u', $string ); 
    $unique = array_unique( $chars );

    return $unique;

}