2011-01-20 6 views
1

PHPスクリプトに送信されているMySQLフォームに問題があります。フォームMS Wordからコピーされたフィールドは、データベースに入力すると無効な文字になります

問題はコピー&にあります。Microsoft Wordまたは類似のワープロソフトから貼り付けられますが、ほとんどの場合は効果がありますが、時には引用符とシングルクォーテーションが適用されます。私はその人が提出している文字エンコードを嗅ぐことができません。

function init_byte_map(){ 
    global $byte_map; 
    for($x=128;$x<256;++$x){ 
    $byte_map[chr($x)]=utf8_encode(chr($x)); 
    } 
    $cp1252_map=array(
    "\x80"=>"\xE2\x82\xAC", // EURO SIGN 
    "\x82" => "\xE2\x80\x9A", // SINGLE LOW-9 QUOTATION MARK 
    "\x83" => "\xC6\x92",  // LATIN SMALL LETTER F WITH HOOK 
    "\x84" => "\xE2\x80\x9E", // DOUBLE LOW-9 QUOTATION MARK 
    "\x85" => "\xE2\x80\xA6", // HORIZONTAL ELLIPSIS 
    "\x86" => "\xE2\x80\xA0", // DAGGER 
    "\x87" => "\xE2\x80\xA1", // DOUBLE DAGGER 
    "\x88" => "\xCB\x86",  // MODIFIER LETTER CIRCUMFLEX ACCENT 
    "\x89" => "\xE2\x80\xB0", // PER MILLE SIGN 
    "\x8A" => "\xC5\xA0",  // LATIN CAPITAL LETTER S WITH CARON 
    "\x8B" => "\xE2\x80\xB9", // SINGLE LEFT-POINTING ANGLE QUOTATION MARK 
    "\x8C" => "\xC5\x92",  // LATIN CAPITAL LIGATURE OE 
    "\x8E" => "\xC5\xBD",  // LATIN CAPITAL LETTER Z WITH CARON 
    "\x91" => "\xE2\x80\x98", // LEFT SINGLE QUOTATION MARK 
    "\x92" => "\xE2\x80\x99", // RIGHT SINGLE QUOTATION MARK 
    "\x93" => "\xE2\x80\x9C", // LEFT DOUBLE QUOTATION MARK 
    "\x94" => "\xE2\x80\x9D", // RIGHT DOUBLE QUOTATION MARK 
    "\x95" => "\xE2\x80\xA2", // BULLET 
    "\x96" => "\xE2\x80\x93", // EN DASH 
    "\x97" => "\xE2\x80\x94", // EM DASH 
    "\x98" => "\xCB\x9C",  // SMALL TILDE 
    "\x99" => "\xE2\x84\xA2", // TRADE MARK SIGN 
    "\x9A" => "\xC5\xA1",  // LATIN SMALL LETTER S WITH CARON 
    "\x9B" => "\xE2\x80\xBA", // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK 
    "\x9C" => "\xC5\x93",  // LATIN SMALL LIGATURE OE 
    "\x9E" => "\xC5\xBE",  // LATIN SMALL LETTER Z WITH CARON 
    "\x9F" => "\xC5\xB8"  // LATIN CAPITAL LETTER Y WITH DIAERESIS 
); 
    foreach($cp1252_map as $k=>$v){ 
    $byte_map[$k]=$v; 
    } 
} 

function fix_latin($instr){ 
    if(mb_check_encoding($instr,'UTF-8'))return $instr; // no need for the rest if it's all valid UTF-8 already 
    global $nibble_good_chars,$byte_map; 
    $outstr=''; 
    $char=''; 
    $rest=''; 
    while((strlen($instr))>0){ 
    if(1==preg_match($nibble_good_chars,$input,$match)){ 
     $char=$match[1]; 
     $rest=$match[2]; 
     $outstr.=$char; 
    }elseif(1==preg_match('@^(.)(.*)[email protected]',$input,$match)){ 
     $char=$match[1]; 
     $rest=$match[2]; 
     $outstr.=$byte_map[$char]; 
    } 
    $instr=$rest; 
    } 
    return $outstr; 
} 

$byte_map=array(); 
init_byte_map(); 
$ascii_char='[\x00-\x7F]'; 
$cont_byte='[\x80-\xBF]'; 
$utf8_2='[\xC0-\xDF]'.$cont_byte; 
$utf8_3='[\xE0-\xEF]'.$cont_byte.'{2}'; 
$utf8_4='[\xF0-\xF7]'.$cont_byte.'{3}'; 
$utf8_5='[\xF8-\xFB]'.$cont_byte.'{4}'; 
$nibble_good_chars = "@^($ascii_char+|$utf8_2|$utf8_3|$utf8_4|$utf8_5)(.*)[email protected]"; 

私は、各フォームフィールドを受け取り、fix_latin機能を実行します。

は、私がデータを処理し、私のファイルの先頭に次のコード(機能)を持っています。

 foreach ($jobdata AS $field => $string) 
     { 
      $string = fix_latin($string); 
      $jobdata[$field] = addslashes(str_replace("\n", '<br />', htmlspecialchars($string))); 
     } 

データはデータベースに入力され、承認のためにシステム管理者にも電子メールで送信されます。今日、私は箇条書きのために、以下のいた管理者の電子メール受信:

Job Description: Responsibilities: 
路 Assist multi-state companies 

をそして、私は、スクリプト内のデータベースまたは編集を表示したときに、弾丸は正方形のボックス、ない•エンティティに置き換えられます。

答えて

0

フォームは、ホスト文書と同じ文字エンコーディングで提出する必要があります。理論的には、フォームを宣言するときに<form accept-charset="UTF-8">を使用して文字エンコーディングを無効にすることはできますが、これはInternet Explorerでは機能しません(驚きの驚き)。

フォームを含むページに同じ文字エンコーディングを使用してデータを送信する場合は、正しい文字エンコーディングを使用してデータを取得する必要があります。

さらに、スクリプトが電子メールを送信し、そのデータをテーブルに格納する場合は、電子メールとテーブルの両方が同じ文字エンコーディングを使用していることを確認する必要があります。電子メールに適切なヘッダーを設定して、使用している文字エンコーディングが読者に分かるようにする必要があります。

UTF8を使用することをお勧めします。データベースとウェブページの両方がUTF8でエンコードされていることを確認してください。また、スクリプトが送信する電子メールもUTF8でエンコードされていることを示すヘッダーを設定してください。うまくいけば、使い慣れた変換機能のような面倒な変換機能が不要になるはずです。私はプロジェクトで同様の問題に遭遇していましたが、最初は問題へのアプローチを試みましたが、最終的には、捕捉して対処する必要がある何千もの潜在的なインプットがあるので対処するのは簡単すぎました。

一方、Wordから直接貼り付けるのではなく、Wordからメモ帳などの簡単なテキストエディタに貼り付け、メモ帳からブラウザに貼り付けて貼り付けるのが簡単です。

関連する問題