2011-09-12 8 views
2

"ӘІҢҒҮҰҚӨҺ"のようなデータがあります。 d398d086d2a2d292d2aed2b0d29ad3a8d2ba * .rtf形式に「\\」を追加する:\ 'd3 \' 8d \ '86 \ '2a \' d2 \ '2d \' ae \ '2b \' d2 \ '広告\ 'A8 \' 2bのstr_replaceが間違った結果を返します

そして私はsomethingl IKEこの取得する必要があります\ 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("ӘІҢҒҮҰҚӨҺ"); 
?> 
+1

check @stackoverflow.com/questions/1451144/php-multi-byte-str-replace – thwd

+0

@Tom、no。これは私のためではなく、これらの手紙はmysql dbから取られました。彼らはユニコード(utf8)で。だから、私はhexed値を比較しようとしているし、rtf specフォーマットを使ってそれを置き換えようとしている。 –

+1

mb_str_replaceはあなたが探しているものです – ajreal

答えて

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=''; 
    } 

} 

このことは、メインの文字列のすべての三文字をスキップしました:ここ は正しいものです。今はOKです。

0

私はあなたが一例として使用した文字列が$input_arrにおける配列のどれが含まれていないという事実以外に、あなたのコードで即時問題を、見ません。私はそのリストに手作業で\'d3\'8dを追加しました。交換が正しく機能していたので、これが問題の原因かもしれません。

はあなたが&#{code};形式で文字をエスケープされ、the utf8tohtml function described in this commentを活用することができるかもしれないので、\u{code}\'3fとしてUnicode文字をエスケープASCII表現にUTF-8に変換されているように見えます。

+0

私はすでに私の間違いを見つけ出し、問題を解決しました。 :)ああ、utf8tohtmlに感謝します。 –

関連する問題