Поля формы, скопированные из MS Word, приводят к неверным символам при вводе в базу данных - PullRequest
1 голос
/ 20 января 2011

У меня проблема с веб-формой, которая отправляется в сценарий PHP и затем вставляется в базу данных MySQL.

Проблема заключается в копировании и вставке из 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('@^(.)(.*)$@s',$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)(.*)$@s";

Я тогдаполучите каждое поле формы и запустите функцию 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

И когда я просматриваю базу данных или редактирую в скрипте, пуля заменяется квадратным квадратом, а неюридическое лицо.

1 Ответ

0 голосов
/ 20 января 2011

Формы должны отправляться с той же кодировкой символов, что и их основной документ. Теоретически вы можете переопределить кодировку символов, используя <form accept-charset="UTF-8"> при объявлении формы, но это не работает в Internet Explorer (неожиданный сюрприз).

Если вы используете ту же кодировку символов для страницы, которая содержит форму, для которой вы хотите, чтобы ваши данные были отправлены, вы должны получать данные, используя правильную кодировку символов.

Кроме того, если ваш сценарий отправляет электронную почту и сохраняет данные в таблице, необходимо убедиться, что и электронная почта, и таблица используют одинаковую кодировку символов. Вы должны установить соответствующие заголовки в своем письме, чтобы убедиться, что читатель знает, какую кодировку символов вы используете.

Я бы рекомендовал использовать UTF8 повсеместно, убедитесь, что ваша база данных и ваши веб-страницы закодированы с помощью UTF8, и что любые письма, отправляемые вашими скриптами, также устанавливают заголовок, указывающий, что они также закодированы с помощью UTF8. Надеемся, что это устранит необходимость в громоздких функциях преобразования, подобных той, которую вы использовали. Я сам сталкивался с подобными проблемами в проекте, и сначала я попробовал ваш подход к проблеме, но в конце концов это было слишком много, чтобы иметь дело с тысячами потенциальных ресурсов, которые вы должны поймать и решить.

Между тем, простой обходной путь - не вставлять напрямую из Word, а вставлять из Word в простой текстовый редактор, такой как Блокнот, а затем копировать и вставлять из Блокнота в браузер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...