Как я могу удалить нечетные символы, вставленные при копировании, такие как: - PullRequest
2 голосов
/ 10 марта 2011

У меня есть php веб-приложение / инструмент, в который люди в конечном итоге копируют данные. Данные в конечном итоге превращаются в XML, для которого определенные символы выдают действительно странные символы после сохранения. Я не уверен, выглядело ли «так» до того, как оно было скопировано. Возможно, это было так истолковано. Это могло быть только длинное "-". В любом случае, все эти персонажи действительно странные. Есть ли способ легко их раздеть?

Ответы [ 3 ]

1 голос
/ 10 марта 2011

Это потому, что PHP использует 8-битное кодирование, но ваши данные, скорее всего, записаны в UTF-8. Вы найдете статью Джоэла о кодировке очень поучительной.

А для краткого ответа попробуйте просто кодировать его в UTF-8

<?php

  $text = $entity['Entity']['title'];
  echo 'Original : ', $text."<br />";

  $enc = mb_detect_encoding($text, "UTF-8,ISO-8859-1");
  echo 'Detected Encoding '.$enc."<br />";

  echo 'Fixed Result: '.iconv($enc, "UTF-8", $text)."<br />";

?>
1 голос
/ 11 марта 2011

Когда вы видите пару символов, начинающуюся с акцентированных «A» или «a», это, как правило, означает, что вы видите символ, фактическая кодировка которого iso-8859-1, отображается программным обеспечением, которое считает, что оно отображает utf-8.

Если вы собираетесь разрешить пользователям изменять текст в документе XML с помощью инструментов, не поддерживающих XML, существует вероятность того, что в итоге вы получите символы, закодированные в iso-8859-1.Это не должно быть проблемой, если в начале файла присутствует объявление XML, в котором говорится, что кодировка iso-8859-1.Но если декларации XML нет или кодировка в объявлении - utf-8, вы получите поврежденные данные.

Вы спрашивали о том, как восстановить данные, но когда выПри повреждении данных основное внимание всегда должно уделяться предотвращению, а не ремонту.

1 голос
/ 10 марта 2011

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

$str = preg_replace($str, "/[A-Za-z0-9'-._\(\)/");
                                               |
                                               V
                                              add more chars here
...