如何在PHP中将任何字符编码转换为UTF8

4
我正在开发一个网络爬虫,从世界各地的网站获取数据,并处理不同的语言和编码。
目前我正在使用以下函数,在99%的情况下都可以正常工作。但是有1%的情况让我头疼不已。
function convertEncoding($str) {
    return iconv(mb_detect_encoding($str), "UTF-8", $str);
}

为什么你同时使用iconv和mbstring?如果你想使用多字节字符串扩展,可以使用mb_convert_encoding。 - Emre Yazici
我尝试了一下...结果还是一样的...你有什么想法吗? - rafaschutz
3个回答

7

与其盲目地尝试检测编码,你应该先检查下载的页面中是否有列出字符集。字符集可能在HTTP响应头中设置,例如:

Content-Type:text/html; charset=utf-8

或者在 HTML 中作为元标签,例如:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 

仅当两者都不可用时,才尝试使用mb_detect_encoding()或其他方法猜测编码。


对的...我根据这个源代码的头部手动输入了一个“from”编码链接。但仍然得到了一个格式不正确的字符串 :( - rafaschutz
该YouTube页面的源编码是UTF-8,因此这里真的没有要转换的东西。 - sagi
做了一些其他的测试...设置a编码得到了积极的结果 :) ...谢谢提示 - rafaschutz

5

由于一些字符集是其他字符集的子集,因此无法以100%的准确率检测字符串的字符集。如果可能的话,请尝试显式地设置字符集,不要混合使用iconvmbstring函数。我建议使用此类函数,并在可能的情况下提供源字符集

function convertEncoding($str, $from = 'auto', $to = "UTF-8") {
    if($from == 'auto') $from = mb_detect_encoding($str);
    return mb_convert_encoding ($str , $to, $from); 
}

我已经使用您的函数测试了它,将$from设置为与源标题相同的编码...返回结果仍然相同 :( - rafaschutz
我正在使用以下源代码进行测试链接 - rafaschutz
亲爱的afaschutz, 请仔细阅读我的回答。我并没有声称它适用于你的情况。我解释了为什么你的方法不正确,并提供了更好的方法。 - Emre Yazici
我已经理解了...谢谢你的提示。 - rafaschutz
此外,大多数字符集/编码使用与其他字符集相同的字节,但具有其他含义(例如ISO-8859-x中的大多数字符集)。有时可以根据字符的分布(取决于语言)可靠地猜测,但通常需要更多的文本才能可靠地工作。 - Paŭlo Ebermann

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接