我有一个问题,我认为这很简单,但事实证明它很复杂。
我有一个长的UTF-8字符串,混合了罗马字符,西欧语,日语和韩语字符以及标点符号。许多是多字节字符,但有些(我认为)不是。
我需要做两件事:
(抱歉,我似乎无法将代码引用格式正确...)
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?我应该输出到文件而不是屏幕吗?
有人有建议吗?对不起,我对此很新,所以我可能只是在做一些非常愚蠢的事情。
答案 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;
}