奇怪的字符编码问题导致js函数失败或添加不需要的字符

Weird character encoding problems causing js functions to fail or add unwanted characters

本文关键字:字符 失败 函数 添加 js 不需要 编码 问题      更新时间:2023-09-26

我正在编写的一个PHP函数使用file_get_contents()从另一个网页中提取一小段HTML数据,然后解析出一段文本并尝试将其存储在数据库中。问题是,它得到的数据必须用不同的字符集或其他东西编码(我不确定如何检查),因为它经常添加ï»?(在字符串中看似随机的地方,而不总是在开头或结尾),并每隔一段时间在我不想要的地方添加一行新行。ï»?很烦人,但当添加换行符时,它会导致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(字节顺序标记),建议将信息解析为xml而不是字符串-我发现有一些php库可以做到这一点(http://php.net/manual/en/book.xml.php)但我认为可能有一种更简单的方法,比如一个简单的php函数,可以自动转换它,或者去掉不需要的字符。

此外,有时信息可能包含引号,但由于这也会扰乱js函数,我尝试使用PHP的addslashes函数,但它不添加任何斜杠,根本不起作用。然而,如果我在php中手动编写相同的字符串,并在上面使用addslash,它会正常添加斜杠,所以这让我觉得php无法理解我得到的文本的编码。发生了一些奇怪的事情,但我不知道如何解决。

我非常愿意接受任何建议,因为我查了很多东西,但找不到解决这个问题的好方法。

可能是UTF-8编码的BOM。如果您知道源代码是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函数使用file_get_contents()从另一个网页中提取一小部分HTML数据,然后解析出一段文本并尝试将其存储在数据库中。问题是,它得到的数据必须用不同的字符集或其他编码(我不确定如何检查)

您可以在使用file_get_contents检索数据后获得响应标头。这些存储在$http_response_header中。以下示例演示了这一点(有关parse_http_response_header函数,请参阅HEAD first with PHP Streams):

$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­RFC 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

如果没有给定字符集参数,则使用该类型的默认字符集(text)。在HTTP中,这是ISO‑8859(ref)。

要正确解析参数,请参阅第3.6节

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

为了正确解析我作为练习留下的参数字符串。