2011-03-23 17 views
2

我有一個多字節字符串一個獨特的問題和需要能夠洗牌,一些公平程度的隨機性,在PHP長UTF-8編碼的多字節字符串不放棄或失去或重複的任意字符。php真正的多字節字符串洗牌功能?

在str_shuffle下的PHP手冊中,有一個不起作用的多字節函數(第一個用戶提交了一個函數):如果我使用了一個字符串,例如所有的日文平假名和字符串長度的片假名(ex) 120個字符,我返回了119個字符或118個字符的字符串。有時我看到重複的字符,即使原始字符串沒有它們。所以這不起作用。

爲了使這個比較複雜,我還需要包括如果可能的話日本UTF-8換行符和換行和標點符號。

人擁有多語言處理UTF-8 MB串經驗能幫助嗎? PHP是否有內置函數來執行此操作? str_shuffle完全是我想要的。我只需要它也能處理多字節字符。

非常感謝!

回答

3

嘗試使用拆分和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 

你會想,以確保在適當的地方指定編碼。

+0

這完全是我在找的東西。您應該將其包含在PHP str_shuffle頁面中。 – Dave 2011-03-24 00:58:48

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

}