奇怪的字符编码问题导致js函数失败或添加不需要的字符
Weird character encoding problems causing js functions to fail or add unwanted characters
我正在编写的一个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
为了正确解析我作为练习留下的参数字符串。
- 在JavaScript中输出转义字符
- 不同浏览器中的空白字符正则表达式行为
- 角度过滤器问题,特殊字符失败
- Mozilla Builder 编辑器取消转义 Unicode 字符,并发 w. AMO 上传失败
- 重复相同的字符时,正则表达式将失败
- 防止 php 在 Javascript 验证失败后执行代码,并防止某些字符使用 JS
- 从MySQL数据库到带有XML报表的PHP的法语字符失败
- 如果存在超过3个字母或2个特殊字符,Regex将失败
- 由于斜杠字符,Firebase多路径更新失败
- JSON分析因特殊字符而失败
- 奇怪的字符编码问题导致js函数失败或添加不需要的字符
- 由于空白字符,Java脚本失败
- 电子邮件验证正则表达式在连字符上失败
- 带有转义字符的JavaScript警告失败
- replace()函数regex失败,显示“无效字符”
- jQuery转义特殊字符失败
- 当单词以丹麦字符æ,ø,å开头时,Javascript正则表达式失败
- TOMCAT报告此错误:信息:字符解码失败
- jquery qrcode使用长度超过34个字符失败
- UTF字符的角度翻译消毒失败