Странные проблемы с кодировкой символов, приводящие к сбою функций js или добавлению нежелательных символов - PullRequest
0 голосов
/ 04 января 2012

PHP-функция, которую я пишу, извлекает небольшой кусочек HTML-данных с другой веб-страницы с помощью file_get_contents (), затем анализирует фрагмент текста и пытается сохранить его в базе данных. Проблема в том, что полученные данные должны быть закодированы с использованием другой кодировки или чего-то еще (я не уверен, как это проверить), потому что они часто добавляют «» (в, казалось бы, случайных местах в строке, а не всегда в начале или в конце). ) и время от времени добавляет новую строку, где я не хочу один. «» Раздражает, но при добавлении новой строки происходит сбой функции javascript. Функция javascript печатается из php-скрипта следующим образом:

print <<<END
    setUpSend("${a}", "${b}", "${c}", "${d}");
END;

И когда вводится новая строка, функция больше не работает (я полагаю, из-за новой строки), и просмотр исходного кода показывает что-то вроде этого:

print <<<END
        setUpSend("a information", "b information
", "c information", "d information");
END;

Я провел некоторое исследование и обнаружил, что это »- это UTF-8 BOM (Byte Order Mark), и предлагается анализировать информацию как xml, а не как строку - я обнаружил, что есть некоторые библиотеки php, которые нужно сделать this (http://php.net/manual/en/book.xml.php), но подумал, что может быть более простой способ, например, простая функция php, которая автоматически преобразует ее или удалит нежелательные символы.

Кроме того, иногда информация может содержать кавычки, но, поскольку это также может испортить функцию js, я попытался использовать функцию addlashes в PHP, и она просто не добавляет слэши, вообще не работает. Однако, если я вручную пишу ту же самую строку в php и использую в ней addlashes, она обычно добавляет косые черты, поэтому я думаю, что php не может понять кодировку этого текста, которую я получаю. Что-то странное происходит, но я заблудился, как это исправить.

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

1 Ответ

4 голосов
/ 04 января 2012

 может быть в кодировке UTF-8 . Обычно вы можете безопасно удалить его, если знаете, что кодировкой источника является UTF-8.

Это простая строковая операция:

$withOutUTF8BOM = remove_UTF8BOM($withOrWithOutUTF8BOM);


/**
 * Remove UTF8BOM from the beginning of a string (if it exists)
 *
 * @return string
 */
function remove_UTF8BOM($str)
{
    $UTF8BOM = "\xEF\xBB\xBF";
    (0 === strpos($str, $UTF8BOM)) && $str = (string) substr($str, 3);
    return $str;
}

Однако похоже, что вы должны знать кодировку ввода кода. Данные HTML могут быть в разных кодировках, поэтому, вероятно, стоит заранее нормализовать кодировку HTML (например, преобразовать все кодировки, отличные от UTF-8, в UTF-8), а затем заставить свои собственные функции правильно обрабатывать данные в кодировке UTF-8.

PHP-функция, которую я пишу, извлекает небольшой кусочек HTML-данных с другой веб-страницы, используя file_get_contents(), затем анализирует фрагмент текста и пытается сохранить его в базе данных. Проблема в том, что полученные данные должны быть закодированы с использованием другой кодировки или чего-то вроде (я не уверен, как это проверить)

Вы можете получить заголовки ответа после получения данных с помощью file_get_contents. Они хранятся в $http_response_header. Следующий пример демонстрирует это (см. HEAD сначала с потоками PHP для функции parse_http_response_header):

$url = 'http://example.com/';

$body = file_get_contents($url);

$responses = parse_http_response_header($http_response_header);

$contentType = $responses[0]['fields']['CONTENT-TYPE']; // CONTENT-TYPE

echo "Content-Type: $contentType\n";  # Content-Type: text/html; charset=UTF-8

Вам нужно только проверить, существует ли эта строка заголовка и была ли задана кодировка. См. Спецификацию заголовка Content-Type & RFY 2616 , как это написано:

list($typeAndSubType, $parameter) = explode(';' $contentType, 2) + array(NULL,NULL);

Если не указан тип носителя (тип и подтип) , вы можете (но не должны) пытаться угадать его. Поскольку вы имеете дело с HTML, это обычно text/html.

   Content-Type   = "Content-Type" ":" media-type

   media-type     = type "/" subtype *( ";" parameter )
   type           = token
   subtype        = token

Если параметр charset не указан, используйте набор символов по умолчанию для этого типа (text). В HTTP это ISO‑8859 ( ref ).

Чтобы правильно проанализировать параметры, см. Раздел 3.6 :

   parameter               = attribute "=" value
   attribute               = token
   value                   = token | quoted-string

Чтобы правильно разобрать строку параметров, я оставляю это упражнение.

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