正确的字符编码

时间:2010-03-04 00:00:15

标签: php character-encoding

我正在为一个网站搜索各种文本数据(当然是获得许可)。我看到的问题是某些字符在此过程中未正确编码。这与撇号(')特别突出:导致如下字符:。

目前,我使用以下代码从已删除的数据转换各种HTML实体:

htmlentities($content, ENT_COMPAT, 'UTF-8', FALSE)

有没有更好的方法来处理这类事情?

4 个答案:

答案 0 :(得分:3)

HTML实体有两个目标:

  • 转义HTML中具有特殊含义的字符,例如角度引号,因此可以将它们用作文字。
  • 显示您正在使用的字符集不支持的字符,例如ISO-8859-1文档中的欧元符号。

它们不完全是编码工具。

如果您想从一个字符集转换为另一个字符集,我建议您使用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说什么?

一个选项(根据您的需要可能不起作用)是使用iconvTRANSLIT选项将字符转换为使用PHP更容易处理的字符。您还可以使用mb_*函数来处理多字节字符串。

您确定htmlentities是问题吗?如果内容为UTF-8,并且您的网站设置为提供ISO-8859-1,则您将看到奇数字符。检查浏览器使用的编码,确保它与您正在生成的字符的编码匹配。

答案 3 :(得分:0)

只要您将false作为最后一个参数传递,我就没有看到使用htmlentities()的任何问题。这样可以确保您不会对任何内容进行两次编码(例如将&转换为&)。