str_replace дает неверный результат - PullRequest
1 голос
/ 12 сентября 2011

У меня есть такие данные: «ӘІҢҒҮҰҚӨҺ». добавив эти данные к этому: d398d086d2a2d292d2aed2b0d29ad3a8d2ba затем добавьте «\» для формата * .rtf: \ 'd3 \' 8d \ '86 \ '2a \' d2 \ '2d \' ae \ '2b \' d2 \ 'ad \' a8 \ '2b

и тогда я должен получить что-то вроде этого: \ u1179 \ 3f \ u1240 \ '3f \ u1186 \' 3f ...

но str_replace заменяет только косые черты Q_Q.

Есть предложения?

вот полный код:

<?
function strToHex($string)
{
    $hex='';
    for ($i=0; $i < strlen($string); $i++)
    {
        $hex .= dechex(ord($string[$i]));
    }
    return $hex;
}

function extra($txt) {
    $output_arr = array (
        //
        "\\u1179\\'3f","\\u1240\\'3f","\\u1186\\'3f","\\u1170\\'3f","\\u1198\\'3f","\\u1200\\'3f","\\u1178\\'3f","\\u1256\\'3f","\\u1210\\'3f"
    );

    $input_arr = array (
        // 
        "\\'d3\\'98","\\'d0\\'86","\\'d2\\'a2","\\'d2\\'92","\\'d2\\'ae","\\'d2\\'b0","\\'d2\\'9a","\\'d3\\'a8","\\'d2\\'ba"
    );

    echo "<br>";
    echo "data: ".$txt."<br>";
    $txt = strtohex($txt);
    echo "hex: ".$txt."<br>";
    for ($ii=0; $ii < strlen($txt); $ii++) {
        //
        if (strlen($tm1)<2) {
            //
            $tm1.=substr($txt,$ii,1);
        }
        else
            {
            //
            $ret.="\\'".$tm1;
            $tm1='';
        }

    }
    echo "RET:[".$ret."]<br>";
    $ret = str_replace($input_arr,$output_arr,$ret);
    echo "RETREP:[".$ret."]<br>";
    return $ret;
}

extra("ӘІҢҒҮҰҚӨҺ");
?>

Ответы [ 2 ]

0 голосов
/ 14 сентября 2011

Я получаю неправильные результаты из-за логики "если" в цикле "for".Вот правильный:

for ($ii=0; $ii < strlen($txt); $ii++) {
    //
    if (strlen($tm1)<2) {
        //
        $tm1.=substr($txt,$ii,1);
    }
    if (strlen($tm1)==2) {
        //
        $ret.="\\'".$tm1;
        $tm1='';
    }

}

В старой версии (вопрос) эта вещь пропускала каждый третий символ главной строки.Так что теперь все работает хорошо.

0 голосов
/ 13 сентября 2011

Я не вижу непосредственной проблемы с вашим кодом, кроме того факта, что строка, которую вы используете в качестве примера, не содержит ни одной из последовательностей в $input_arr. Я добавил \'d3\'8d вручную в этот список, и замена работала правильно, поэтому это может быть источником вашей проблемы.

Похоже, вы конвертируете UTF-8 в представление ASCII, которое экранирует символы Юникода как \u{code}\'3f, поэтому вы можете использовать функцию utf8tohtml, описанную в этом комментарии , которая экранирует символы в формате &#{code};.

...