str_replace给出了错误的结果

时间:2011-09-12 08:29:26

标签: php unicode hex rtf str-replace

我得到的数据是这样的:“ӘІҢҒҮӘІҢҒҮҚӨҺ”。 将此数据改为此: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 :(得分:0)

我发现您的代码没有立即出现问题,除了您用作示例的字符串不包含$input_arr中的任何序列这一事实。我手动将\'d3\'8d添加到该列表中,并且替换工作正常,因此这可能是您问题的根源。

您似乎正在将UTF-8转换为以\u{code}\'3f转义Unicode字符的ASCII表示形式,因此您可以利用the utf8tohtml function described in this comment来转义&#{code};中的字符格式。

答案 1 :(得分:0)

由于“for”循环中的“if”逻辑,我得到了错误的结果。 这是正确的:

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

}

在旧版本(问题)中,这个东西正在跳过主字符串的每个第三个字符。所以现在它运作正常。