2

実際に私の期待した結果は-ゼロ০1১2২3৩4৪5৫6৬7৭8৮9৯

しかし、私はゼロになりました-ゼロ&#ý৯;ý৯;3৭;৬;ý৯;ý৯;3৭;ý৯;3৮;; 1つの&#ý৯;ý৯;3৭;৬;ý৯;ý৯;3৭;ý৯;;
2つのý৯;ý৯;3৭;৬;
3つのý৯;3৭;
4つのý৯;3৮;
5つのý৯;
6৬<br/>7৭<br/>8৮<br/>9৯嘆願が私を助けてくれます。コード:

$n=array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9');

 $x=array("&#2534;", "&#2535;", "&#2536;", "&#2537;", "&#2538;", "&#2539;", "&#2540;", "&#2541;", "&#2542;", "&#2543;");

$on='O 0
 one 1
 two 2
 three 3
 four 4
 five 5
 six 6
 seven 7
 eight 8
 nine 9';

 $converted = nl2br(str_replace($n, $x, $on));


 echo $converted;
4

2 に答える 2

1

str_replaceエンコーディングセーフではありません。ここにマルチバイトstr_replacemb_str_replace)の実装があります:

function mb_str_replace($needle, $replacement, $haystack)
{
    $needle_len = mb_strlen($needle);
    $replacement_len = mb_strlen($replacement);
    $pos = mb_strpos($haystack, $needle);
    while ($pos !== false)
    {
        $haystack = mb_substr($haystack, 0, $pos) . $replacement
                . mb_substr($haystack, $pos + $needle_len);
        $pos = mb_strpos($haystack, $needle, $pos + $replacement_len);
    }
    return $haystack;
}

編集:おっと、あなたのキャラクターはHTMLエンコードされており、PHPエンコードの問題ではありません。

于 2013-02-10T12:14:39.093 に答える
1

この目的で使用する関数はstrtr()です。

$x = array("&#2534;", "&#2535;", "&#2536;", "&#2537;", "&#2538;", "&#2539;", "&#2540;", "&#2541;", "&#2542;", "&#2543;");
$converted = nl2br(strtr($on, $x));
echo $converted;

これにより、次が生成されます。

O ০
1 ১
2 ২
3 ৩
4 ৪
5 ৫
6 ৬
7 ৭
8 ৮
9 ৯

str_replace() はここでは機能しません。これは、配列内の後のエントリが、前のエントリによって行われた置換で文字を置き換えているためです。

PS 配列は実際には連想配列でなければなりません (つまり、"0" => "০")。私は怠惰すぎて変更を加えることができず、整数キーがたまたま正しいという事実を利用していました。

于 2013-02-10T12:27:11.410 に答える