Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何检测是否必须对字符串应用UTF-8解码或编码?_Php_Encoding_Utf 8 - Fatal编程技术网

Php 如何检测是否必须对字符串应用UTF-8解码或编码?

Php 如何检测是否必须对字符串应用UTF-8解码或编码?,php,encoding,utf-8,Php,Encoding,Utf 8,我有一个来自第三方网站的提要,有时我必须应用utf8\u解码,有时则应用utf8\u编码,以获得所需的可见输出 如果错误地应用了相同的东西两次/或使用了错误的方法,我会得到更难看的东西,这就是我想要改变的 如何检测何时必须对字符串应用什么 实际上,内容返回UTF-8,但其中有些部分不是。提要(我猜您是指某种基于XML的提要)的标题中应该有一个属性,告诉您编码是什么。如果没有,你就不走运了,因为你没有可靠的方法来识别编码。你可以使用 -检测字符编码 字符集也可能在或响应数据本身中可用 例如:

我有一个来自第三方网站的提要,有时我必须应用
utf8\u解码
,有时则应用
utf8\u编码
,以获得所需的可见输出

如果错误地应用了相同的东西两次/或使用了错误的方法,我会得到更难看的东西,这就是我想要改变的

如何检测何时必须对字符串应用什么

实际上,内容返回UTF-8,但其中有些部分不是。提要(我猜您是指某种基于XML的提要)的标题中应该有一个属性,告诉您编码是什么。如果没有,你就不走运了,因为你没有可靠的方法来识别编码。

你可以使用

  • -检测字符编码
字符集也可能在或响应数据本身中可用

例如:

var_dump(
    mb_detect_encoding(
        file_get_contents('http://stackoverflow.com/questions/4407854')
    ),
    $http_response_header
);
输出():


编码自动检测不是防弹的,但您可以尝试
mb\u detect\u Encoding()
。另请参见
mb\u check\u encoding()

我不能说我可以依赖
mb\u detect\u encoding()
。前一阵子我有一些奇怪的假阳性

我发现在任何情况下都能很好地工作的最普遍的方法是:

if (preg_match('!!u', $string))
{
   // This is UTF-8
}
else
{
   // Definitely not UTF-8
}

我们是否应该假设feed声明了某个字符集,但使用了另一个字符集?请提供一个示例feed please+1实现了一个utf8\u validate(),它使用您的解决方案将字符串转换为utf8,如果它不是,则作为一个字符!非常感谢。这是一个非常聪明的把戏;-)因为我完全不知道它是如何工作的,所以我深入研究了PHP文档,发现:
u(PCRE8)这个修饰符打开了与Perl不兼容的PCRE的附加功能。模式字符串被视为UTF-8。此修饰符可从Unix上的PHP4.1.0或更高版本以及win32上的PHP4.2.3获得。从PHP4.3.5开始检查模式的UTF-8有效性无论如何,非常感谢!regexp中的那个点甚至不需要
preg_match(“!!u”,$str)
ok该点将使空字符串甚至返回0(等于false)。但是空字符串是有效的UTF-8;)。“这只是一个空的正则表达式。!是分隔符,u是修改器。”解决方案确实很聪明,但需要一些更详细的解释,所以我问了这个问题-
if (preg_match('!!u', $string))
{
   // This is UTF-8
}
else
{
   // Definitely not UTF-8
}
function str_to_utf8 ($str) {
    $decoded = utf8_decode($str);
    if (mb_detect_encoding($decoded , 'UTF-8', true) === false)
        return $str;
    return $decoded;
}

var_dump(str_to_utf8("« Chrétiens d'Orient » : la RATP fait marche arrière"));
//string '« Chrétiens d'Orient » : la RATP fait marche arrière' (length=56)
var_dump(str_to_utf8("« Chrétiens d'Orient » : la RATP fait marche arrière"));
//string '« Chrétiens d'Orient » : la RATP fait marche arrière' (length=56)