我正在为一个网站搜索各种文本数据(当然是获得许可)。我看到的问题是某些字符在此过程中未正确编码。这与撇号(')特别突出:导致如下字符:。
目前,我使用以下代码从已删除的数据转换各种HTML实体:
htmlentities($content, ENT_COMPAT, 'UTF-8', FALSE)
有没有更好的方法来处理这类事情?
答案 0 :(得分:3)
HTML实体有两个目标:
它们不完全是编码工具。
如果您想从一个字符集转换为另一个字符集,我建议您使用iconv()。但是,您必须知道源和目标字符集。应该在Content-Type响应头中提及源字符集,并且您在启动站点时决定了目标字符集(尽管在您的情况下看起来像UTF-8是最合理的选项)。
答案 1 :(得分:0)
您不想立即使用htmlentities,我会在存储它之前在最后一点使用该数据。你遇到的一个问题是人们并不总是正确编码他们的实体。不是每个人都使用™,他们只是复制商标。如果你设置一些逻辑来尝试抓住他们放入的任何东西并正确编码,你可能会更好。例如:
$patterns = array();
$patterns[0] = '/—/';
$patterns[1] = '/&nsbsp;/';
$patterns[2] = '/®/';
$replacements = array();
$replacements[2] = '&151;';
$replacements[1] = '&160;';
$replacements[0] = '&174;';
$ourhtml = preg_replace($patterns, $replacements, $html);
您可以找到所有“陷阱”字符,如破折号和单引号,撇号等,并手动编码,以及对实体(文本或数字)使用设置标准。
您也可以使用正则表达式来执行相同的操作,并且可能是更优雅的解决方案。但我的建议是花一些时间过滤掉你不想要的东西,然后你知道你的数据将准确地准备好你喜欢的方式。
答案 2 :(得分:0)
根据提供的信息建议事情有点困难。你能提供一个例子的文本片段吗?
如果做不到这一点,我将采用霰弹枪的方法(例如,建议一堆东西并希望其中一个击中)
首先,您确定要访问的页面是以UTF-8编码的吗? mb_detect_encoding
说什么?
一个选项(根据您的需要可能不起作用)是使用iconv
和TRANSLIT
选项将字符转换为使用PHP更容易处理的字符。您还可以使用mb_*
函数来处理多字节字符串。
您确定htmlentities
是问题吗?如果内容为UTF-8,并且您的网站设置为提供ISO-8859-1,则您将看到奇数字符。检查浏览器使用的编码,确保它与您正在生成的字符的编码匹配。
答案 3 :(得分:0)
只要您将false
作为最后一个参数传递,我就没有看到使用htmlentities()的任何问题。这样可以确保您不会对任何内容进行两次编码(例如将&
转换为&
)。