2012-04-03 21 views
2

私は非ascii番号、特にperso-arabic番号の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

答えて

3

一部の文字(おそらくすべて)は、1バイト以上のASCII文字列を使用しています。したがって、文字列を操作するにはmultibyte string functionsを使用する必要があります。 strlen,substrstrrev(またはその他の通常の文字列関数)を使用することはできません。文字列を配列として扱うことはできません。

$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便利なリンク –

+0

私は間違っていました。元の文字列を破るだけでなく、カンマを追加すると、それらの文字も結果に表示されます。 ? – max

+0

@max、私の更新答えを見てください。これらのマルチバイト文字列を扱うときは、通常の文字列関数をどこでも使用することはできません。 – bfavaretto

3

(あなたのアラビア文字列ここで

は、私はカンマを追加するために使用関数でありますつまり、exchange()から取得したもの)は、UTF-8、または基本的には8ビット以外の形式でエンコードされている可能性が非常に高いです。あなたが配列(PHPが8ビットであることを前提としている)で文字列をつまずくとすぐに、UTF-8文字列を壊し、それがスクリーンに印刷されるときにそれらの面白い疑問符が出てきます(ところで、ドキュメントのエンコーディングタイプがUTF-8に設定されていることを確認してください)。

PHPのバージョンによっては、mb_string関数を使用して、マルチバイト文字列を作成する必要があります。

+0

+1はUTF-8を破る配列についての説明です。 –

+0

申し訳ありません私は間違っていただけ元の文字列を破るだけでなく、コンマを追加するときに、それらの文字も結果に表示されます、文字列は、コンマを追加しないでください、その上の任意の考え? – max

+0

UTF-8は単なる8ビット文字列ではないためです。実際のビットに応じて、UTF-8文字は8ビットまたは16ビット(あるいはそれ以上)である可能性があります。 UTF-8文字とそれに続く単純な8ビット文字とUTF-8の表示エンコーディングを混在させると、UTF-8文字の一部であると思ってブラウザが誤ってカンマを印刷する可能性があります。 –

関連する問題