PHP - 如何检测编码?

时间:2011-03-10 03:31:51

标签: php regex encoding character-encoding

我正在使用亚马逊的API来获取图书的描述。 API返回XML响应,并且描述标记(使用HTML)非常糟糕。为了处理这个标记不清的描述,这通常打破了我网站的布局,我正在尝试使用HTML Tidy来“清理它”。

为了防止在我的网页上显示“怪异”字符,我想我需要告诉Tidy输入编码是什么以及所需的输出编码是什么。我知道我希望输出为UTF8。但是,我不确定如何确定输入的编码(亚马逊的书籍描述)。

我尝试过这样的事情:

mb_detect_encoding($amazon_description);

这有帮助,但我偶尔会得到奇怪的角色(带有问号的黑色钻石: )。我的猜测是我没有正确检测到编码。

有什么建议我需要做什么?

修改

这是我目前的解决方案:

$sanitized_amazon_markup = preg_replace('/[^\w`~!@#$%^&*()-=_+[\]{}|;\':",.\/<>? ]/', '', $sanitized_amazon_markup);

我不确定这一点,因为这可能会删除我应该保留的内容。

1 个答案:

答案 0 :(得分:0)

你能提供整洁的repairString调用吗?

如果您尝试使用来自整洁选项的input-encodingoutput-encoding,请尝试不使用这些选项并使用第三个参数或repairString代替,如下所示:

$oTidy = new tidy();
$page_content = $oTidy->repairString($page_content,
    array("show-errors" => 0, "show-warnings" => false),
    "utf8"
);

编辑:

在做了一些测试之后,如果你在调用$page_content

之前已经在repairString中没有utf8编码,那么之前说过的话就行不通了

但如果不是UTF-8,你最终将使用ISO-8859-1(latin1)编码。

我建议你尝试一下:

$charset = mb_detect_encoding($amazon_description, 'UTF-8, ISO-8859-1');
if ($charset == "ISO-8859-1") {
    $amazon_description = utf8_encode($amazon_description);
}
$oTidy = new tidy();
$amazon_description = $oTidy->repairString($amazon_description,
    array("show-errors" => 0, "show-warnings" => false),
    "utf8"
);