2012-04-20 10 views
1

ひどく変換されたヘブライ語PDFを処理するために、HTML文書内のテキストを逆順にするPHPスクリプトを作成しています。 (sigh :))なぜ私は不器用な文字を取得していますか?

しかし、すべてのスクリプトは非常に奇妙な出力を持っています。ヘブライ文字の代わりに空白文字(疑問符のついた黒い菱形)に変わるのは、文字の一部だけです。

私はそれ以上で見つけることができましたが、何も変わっていない解決策を試しました。おそらくあなたは私を啓発することができますか?

現在地アクションでスクリプトを確認することができます:pilau.phpnet.us/html_invert.php、これは全体のソースコードです:私は推測する文字コードに問題があるよう

<!DOCTYPE html> 
<html lang="he-IL"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
</head> 
<body> 
    <form action="html_invert.php" method="post" enctype="application/x-www-form-urlencoded"> 
     <textarea id="html_code" name="html_code" rows="30" cols="80"><?php 
      if (isset($_POST['html_code'])) 
      { 
       function invert_string ($str) { 
         $new_str = ''; 
         $i = strlen($str); 
         while ($i > 0) { 
          $new_str .= substr($str, --$i, 1); 
         } 
         return '>'.$new_str.'<'; 
        } 

        echo htmlspecialchars(preg_replace('/>(\s*.*\s*)</imUue', 'invert_string("$1")', stripslashes($_POST['html_code']))); 
      } 
      else { echo 'paste your text here'; } 
     ?></textarea> 
     <br /> 
     <input type="submit" value="Process HTML" /> 
    </form> 
</body> 
</html> 
+1

あなたはマルチバイトの安全のために '' mb_substr'とmb_strlen'をしたいです。 – geoffspear

+0

また、私は 'stripslashes'がUTFに対して安全だとは思わない。 – Matthew

+0

リンクから出力を取得できませんでした。 – RyanS

答えて

0

は、私は答えとして、この質問をマークしたかったので、ここで説明したようにWoobleとマシューの溶液、礼儀です

私はmb_substr('UTF-8')mb_strlen('UTF-8')を使用しました。また、stripslashes()をこの正規表現で置換しました:preg_replace(array('/\x5C(?!\x5C)/u', '/\x5C\x5C/u'), array('','\\'), $_POST['html_code'])。次のように

このように完全なコードは次のとおりです。

<textarea id="html_code" name="html_code" rows="30" cols="80"><?php 
     if (isset($_POST['html_code'])) 
     { 
      function add_delimiters ($str, $deli, $optional_suffix) { 
       return (isset($optional_suffix) ? $deli.$str.$optional_suffix : $deli.$str.$deli); 
      } 

      function reverse_string ($str) { 
       $new_str = ''; 
       $i = mb_strlen($str, 'UTF-8'); 
       while ($i > 0) { 
        $new_str .= mb_substr($str, --$i, 1, 'UTF-8'); 
       } 
       return $new_str; 
      } 

      function utf_stripslashes ($str) { 
       return preg_replace(array('/\x5C(?!\x5C)/u', '/\x5C\x5C/u'), array('','\\'), $str); 
      } 

      function strip_blank_lines ($str) { 
       return preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/u", "\n", $str); 
      } 

      function reverse_html_content ($html) { 
       return preg_replace('/>(\s*.*\s*)</imUue', 'add_delimiters(reverse_string("$1"), ">", "<")', utf_stripslashes($html)); 
      } 

      function clear_unsupported_css ($style) { 
       return preg_replace(array('/top:\s{0,1}([0-9]*(?!px));{0,1}/iu', '/left:\s{0,1}([0-9]*(?!px));{0,1}/iu'), array('top:$1px;', 'left:$1px;'), $style); 
      } 

      function process_inline_style ($html, $func) { 
       return preg_replace('/style="[a-zA-Z0-9:;\s{0,1}]*"/imUue', $func.'("$0")', $html); 
      }    

      echo strip_blank_lines(htmlspecialchars(process_inline_style(reverse_html_content($_POST['html_code']), 'clear_unsupported_css'))); 
     } 
     else { echo 'paste your text here'; } 
    ?></textarea> 
1

が見えます。

php.iniでdefault_charsetを探します。これはiso-8859-1に設定されている可能性があります。

編集:今、私はそれを考える、あなたもこのヘッダを送信してみてください:

header('Content-Type: text/html; charset=utf-8'); 
+1

彼はすでにHTMLにそのヘッダを持っています。どのような違いがPHP経由で送信するのですか? – Travesty3

関連する問題