在PHP中检测字符串的字符集(UTF-8或Windows-1256)

4
我正在基于“Simple HTML DOM”编写脚本,我想在获取URL的内部文本后检测字符串的字符集,然后使用iconv()将其转换为“UTF-8”。我已经尝试了很多方法,但是没有一种方法适用于Windows-1256。 我所尝试过的有:

mb_detect_encoding($content)Windows-1256检测为UTF-8
mb_detect_encoding($content, "windows-1256")会出现错误Illegal argument

function is_utf8($string) {   
  return preg_match('%^(?:  
  [\x09\x0A\x0D\x20-\x7E] # ASCII  
  | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte  
  | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs  
  | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte  
  | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates  
  | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3  
  | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15  
  | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16  
  )*$%xs', $string);
}

如果不是 UTF-8 编码,此函数将返回“0”,但当字符串为UTF-8编码时,它会返回“页面无法找到”。我不确定原因!
我的代码如下:

$html = file_get_html($url);
foreach($html->find('div[id=content]') as $element) {
  $content = $element->innertext;
  #Detect charset encoding of $content
}

我正在处理的链接:
UTF-8: http://www.masrawy.com/news/Egypt/Politics/2013/March/3/5541050.aspx
Windows-1256: http://www.youm7.com//News.asp?NewsID=965545

2个回答

5

您是否尝试过使用

function is_utf8($string) {
  return (mb_detect_encoding($string, 'UTF-8', true) == 'UTF-8');
}

对于您指定的URL,这对我是有效的。

此外,在尝试几个不同的选项时,我发现masrawy.com网站经常无法加载(可能是您看到“找不到页面”的原因)...

奇怪的是,尝试像您一样使用正则表达式导致我的Windows安装程序完全崩溃,同时将Apache带下来。


看起来提问者没有告诉我们这是否有效。所以我自己测试了一下,它是有效的。我处于相同的情况,无论页面是windows1256还是UT-8,这就是如何调用您的函数并应用另一个转换函数utf8()。if(!is_utf8($t2)) echo $t2=utf8($t2)."<br/>"; else echo $t2."<br/>"; - Salem

0

这是整个函数,根据Mark的答案和我之前使用的函数。

function utf8($utf8){   
if(mb_detect_encoding($string,'UTF-8',true) =='UTF-8'); 
return $utf8; else 
$utf8=iconv("windows-1256","utf-8",$utf8);
return $utf8;
  }

只需调用该函数,它将返回正确的值。

utf8($text) 

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