Почему я не могу избавиться от этого? - PullRequest
8 голосов
/ 30 августа 2010

Каждая строка представляет собой строку

 4 
 minutes 
 12
 minutes
 16
 minutes

Мне удалось успешно удалить Â, используя str_replace, но не сущность HTML. Я нашел этот вопрос: Как удалить специальные символы html?

Но preg_replace не сделал эту работу. Как я могу удалить сущность HTML и это A?

Изменить: Я думаю, что должен был сказать это раньше: я использую DOMDocument::loadHTML() и DOMXpath. Edit: Поскольку это похоже на проблему кодирования, я должен сказать, что это фактически все отдельные строки.

Ответы [ 2 ]

18 голосов
/ 30 августа 2010

Хорошо - я думаю, что у меня есть справка об этом сейчас - я хочу подробнее остановиться на некоторых ошибках кодирования, с которыми сталкиваются люди:

Кажется, это сложный случай с Моджибаке, новот что я думаю происходит.Первоначальное подозрение MikeAinOz в том, что это данные UTF-8, вероятно, соответствует действительности.Если мы возьмем следующие данные UTF-8:

4 minutes

Теперь удалите сущность HTML и замените ее на символ, которому она фактически соответствует: U + 00A0.(Это неразрывный пробел, поэтому я не могу точно «показать» вас. Вы получаете строку: «4 минуты». Кодируйте ее как UTF-8, и вы получите следующую последовательность байтов:

characters:  4  [nbsp]   m   i   n ...
bytes     : 34  C2  A0  6D  69  6E ...

(я использую [nbsp] выше для обозначения буквального неразрывного пробела (символ, а не сущность HTML  , но символ, который представляет. Это просто пробел, и, следовательно, сложный.)Обратите внимание, что [nbsp] / U + 00A0 (неразрывный пробел) занимает 2 байта для кодирования в UTF-8.

Теперь, чтобы перейти от байтового потока к читаемому тексту, мы должны декодировать, используя UTF-8, так как это то, что мы кодировали. Давайте использовать ISO-8859-1 ("latin1") - если вы используете неправильный, это почти всегда так.

bytes     : 34  C2      A0  6D  69  6E ...
characters:  4   Â  [nbsp]   m   i   n ...

И переключать необработанный-разбив пробел в его представление сущности HTML, и вы получите то, что у вас есть.

Итак, либо ваш PHP-компонент интерпретирует ваш текст в неправильном наборе символов, и вы должны сказать это иначе, либо вы выводитерезультат как-то в неправильном наборе символов. Больше кода было бы полезно, онкуда вы берете данные, передаваемые в этот loadHTML, и как вы собираетесь получать вывод, который вы видите?


Некоторые сведения: «кодировка символов» - это простосредство перехода от серии символов к серии байтов.Какие байты представляют "é"?UTF-8 говорит C3 A9, тогда как ISO-8859-1 говорит E9.Чтобы получить исходный текст из серии байтов, мы должны знать, с чем мы его закодировали.Если мы декодируем C3 A9 как данные UTF-8, мы получаем «é» обратно, если мы (ошибочно) декодируем его как ISO-8859-1, мы получаем «Ã ©».Junk.В псевдо-коде:

utf8-decode ( utf8-encode ( text-data ) )           // OK
iso8859_1-decode ( iso8859_1-encode ( text-data ) ) // OK
iso8859_1-decode ( utf8-encode ( text-data ) )      // Fails
utf8-decode ( iso8859_1-encode ( text-data ) )      // Fails

Это не код PHP и не ваше исправление ... это просто суть проблемы.Это происходит где-то в большом масштабе, и все в замешательстве.

0 голосов
/ 30 августа 2010

Это похоже на ошибку кодирования - ваш документ кодируется с помощью UTF-8, но отображается как ASCII.Решение вашего несоответствия кодировки решит ваши проблемы.Вы можете попробовать использовать utf8_decode() на своем источнике перед использованием DOMdocument::loadHTML()

Вот альтернативное решение со страницы документации DOMdocument::loadHTML() .

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