我目前正在获取一个网站的各种文本数据(当然是经过许可的)。我遇到的问题是,在这个过程中,某些字符没有正确编码。这在撇号(')方面尤为突出,导致出现了像这样的字符: 。
目前,我使用以下代码来转换从获取的数据中的各种HTML实体:
htmlentities($content, ENT_COMPAT, 'UTF-8', FALSE)
有没有更好的方法来处理这种情况?
我目前正在获取一个网站的各种文本数据(当然是经过许可的)。我遇到的问题是,在这个过程中,某些字符没有正确编码。这在撇号(')方面尤为突出,导致出现了像这样的字符: 。
目前,我使用以下代码来转换从获取的数据中的各种HTML实体:
htmlentities($content, ENT_COMPAT, 'UTF-8', FALSE)
有没有更好的方法来处理这种情况?
HTML实体有两个目的:
它们并不是一个编码工具。
如果您想从一个字符集转换为另一个字符集,我建议您使用iconv()。但是,您必须知道源字符集和目标字符集。源字符集应在Content-Type响应头中提到,而目标字符集是您在启动网站时决定的(尽管在您的情况下,UTF-8似乎是最合理的选择)。
你不想立即使用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);
你可以手动查找所有的“陷阱”字符,如破折号、单引号、撇号等,并对它们进行编码,也可以使用一组标准实体(文本或数字)。
你也可以使用正则表达式来完成同样的事情,这可能是更优雅的解决方案。但我的建议是花些时间手动过滤掉不需要的内容,然后你就知道你的数据将会被准备得恰好符合你的要求。
根据提供的信息,建议有些困难。您能提供一小段示例文本吗?
如果没有,我会采用“散弹枪”方法(例如,建议一堆东西,希望其中一个命中)
首先,请确认您正在访问的页面是否以UTF-8编码。 mb_detect_encoding
显示什么?
一种选择(根据您的需求可能无法工作)是使用 iconv
和 TRANSLIT
选项将字符转换为易于使用PHP处理的内容。您还可以查看使用 mb_*
函数处理多字节字符串。
您确定 htmlentities
是问题所在吗?如果内容是UTF-8,并且您的站点设置为提供ISO-8859-1,则会看到奇怪的字符。检查您的浏览器使用的编码方式,以确保其与您生成的字符的编码方式匹配。
只要您将最后一个参数设置为false
,使用htmlentities()没有任何问题。这将确保您不会对任何内容进行两次编码(例如将&
转换为&
)。
htmlentities
将字面上的&
转换为&
(例如,它也会对<
等进行相同的操作)。你的代码似乎是将实体编码字符串从命名版本翻译成十进制版本。我不认为这是发帖者遇到的问题。此外,在这里使用preg_replace
是完全多余的,str_replace
就足够了。 - davidtbernal