2012-04-03 63 views
2

我想寫函數來爲非ascii數字,特別是perso阿拉伯數字做number_format()作業。處理非ascii字符串作爲數組和 字符

首先我來交換這給我留下了非ASCII字符的字符串的數字:

$n = 133; 
$n = exchange($n); 
echo $n ; 
//result : ١٣٣ 

問題是,當我加逗號的數字或者說串,我的最終結果自帶一些 字符。

這裏是我使用添加逗號功能:

static public function addcomma($number) 
     { 

    $i = strlen($number)-1; 
    $c = 0 ; 

    for($i ; $i >= 0 ; $i--){ 
    $c++; 

    if($c == 1) 
    $y =mb_substr($number, $i, 1); 
    else 
    $y .= mb_substr($number, $i, 1); 



    if($c%3 == 0 && $i != 0) 
    $y .=','; 
    } 
    $y = strrev($y); 
    return $y; 

    } 

這是$n = ١٣٣結果:

3,3,1

+0

你需要把逗號放在什麼地方?那個字符串是什麼編碼? – zerkms 2012-04-03 03:12:18

回答

3

您的一些字符(可能全部)存儲在多個字節中,取消了常規ASCII字符串。所以你必須使用multibyte string functions來操縱字符串。您不能使用strlensubstrstrrev(或任何其他常規字符串函數),並且不能僅將字符串視爲數組。所以,你必須改變你的代碼的某些部分,如:

$i = mb_strlen($number)-1; 
// (...) 
$y = mb_substr($number, $i, 1); 

沒有多字節等同於strrev,所以你可以試試這個(在strrev手冊頁面上comment建議):

// strrev won't work 
// $y = strrev($y); 
$y = join("", array_reverse(preg_split("//u", $y))); 

上面的代碼將把字符串拆分爲一個數組,尊重多字節邊界(注意在正則表達式的末尾有u),將該數組反轉,然後將它加回到一個字符串。

+0

+1爲有用的鏈接 – 2012-04-03 04:03:51

+0

對不起,我錯了它不僅僅是打破原來的字符串,而且當我添加逗號,這些字符也出現在結果上,字符串出來罰款,如果我不添加逗號,對此的任何想法? – max 2012-04-03 04:37:39

+0

@max,看我更新的答案。處理這些多字節字符串時,不能在任何地方使用常規字符串函數。 – bfavaretto 2012-04-03 14:48:32

3

你阿拉伯語字符串(即無論你從exchange()得到什麼)都很可能以UTF-8編碼,或者基本上是一些非8位格式。當你開始將字符串作爲一個數組來操作(PHP假定爲8位)時,你打破了UTF-8字符串,並且在打印到屏幕時出現了這些有趣的問號(順便說一下,確保您的文檔編碼類型也設置爲UTF-8)。

根據PHP的版本,您需要使用mb_string函數來擺弄多字節字符串,這就是您所擁有的。

+0

+1有關數組破解UTF-8的解釋。 – 2012-04-03 04:04:50

+0

對不起,我錯了它不只是打破原來的字符串,而且當我添加逗號,這些字符也出現在結果上,字符串出來罰款,如果我不添加逗號,任何想法呢? – max 2012-04-03 04:37:44

+0

同樣,這是因爲UTF-8不只是一個8位字符串。根據實際位,UTF-8字符可以是8位或16位(或更多,我相信?)。 UTF-8字符,然後是簡單的8位字符和UTF-8的顯示編碼的混合可能會導致瀏覽器錯誤地打印逗號,認爲它是UTF-8字符的一部分。 – 2012-04-03 04:42:37