在日语网站上删除包含某些字符编码问题的元数据

时间:2018-01-11 10:58:57

标签: php wordpress curl utf-8

对于Wordpress上的一个小项目,我试图从给定URL的网站(即缩略图和发布者)中删除一些信息。我知道有很少的插件做类似的事情,但他们通常将结果注入文章本身,这不是我的目标。此外,我使用的那个往往有同样的问题。

我的总体目标是在帖子自定义字段中显示给定网址的缩略图和发布商名称。我暂时从opengraph metatags中获取数据(我是一个懒惰的人)。

整体代码有效但在处理非拉丁字符时我得到了通常的错位文本(这是105%的情况)。对我来说更奇怪:这取决于网站。

我已尝试在卷曲中使用ForceUTF8和gzip压缩,如此处的各种答案所推荐,但结果仍然相同(或变得更糟)。

目前我唯一的线索是如何在每个页面上声明编码

例如,对于3个URL我给出了:

https://www.jomo-news.co.jp/life/oricon/25919
    <meta charset="UTF-8" />
    <meta property="og:site_name" content="上毛新聞" />

结果&gt; 上æ¯>æ-°èž

不行

https://entabe.jp/21552/rl-waffle-chocolat-corocoro
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta property="og:site_name" content="えん食べ [グルメニュース]" />

结果&gt;えん食べ[グルメニュース]

确定

https://prtimes.jp/main/html/rd/p/000000008.000026619.html
    <meta charset="utf-8">
    <meta property="og:site_name" content="プレスリリース・ニュースリリース配信シェアNo.1|PR TIMES" />

结果&gt; ãƒ-ãƒãã,¹ƒƒƒƒƒƒƒƒããッƒƒƒƒƒƒƒãッãッƒƒƒãッããッãッãッãッãッãã

不行

供参考,我使用的卷曲声明

    function file_get_contents_curl($url)
        {
            header('Content-type: text/html; charset=UTF-8');
            $ch = curl_init();

            curl_setopt($ch, CURLOPT_HEADER, 0);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

            $data = curl_exec($ch);
            curl_close($ch);
            return $data;
        }

报废功能:

function get_news_header_info($url){
  //parsing begins here:

  $news_result = array("news_img_url" => "", "news_name" => "");
  $html = file_get_contents_curl($url);
  $doc = new DOMDocument();
  @$doc->loadHTML($html);

  $metas = $doc->getElementsByTagName('meta');

  for ($i = 0; $i < $metas->length; $i++)
  {
      $meta = $metas->item($i);
      if($meta->getAttribute('property') == 'og:site_name')
        {
          if(! $news_name)
            $news_name = $meta->getAttribute('content');
        }
  //Script continues
}

任何人都知道这三种情况之间有什么不同以及我如何处理它?<​​/ p>

修改

看起来即使所有网站都宣布了UTF-8字符集,在查看curl_getinfo()并测试一堆字符集转换组合之后,还需要转换为ISO-8859-1。

所以只需添加一个

iconv("UTF-8", "ISO-8859-1", $scrapped_text);

足以解决问题。

为了给出完整的答案,以下是测试转换对的代码片段from this answer by rid-iculous

$charsets = array(  
        "UTF-8", 
        "ASCII", 
        "Windows-1252", 
        "ISO-8859-15", 
        "ISO-8859-1", 
        "ISO-8859-6", 
        "CP1256"
        ); 

foreach ($charsets as $ch1) { 
    foreach ($charsets as $ch2){ 
        echo "<h1>Combination $ch1 to $ch2 produces: </h1>".iconv($ch1, $ch2, $text_2_convert); 
    } 
} 

问题解决了,玩得开心!

1 个答案:

答案 0 :(得分:0)

看起来甚至使用UTF-8声明所有页面都很难,一些ISO-8859-1被隐藏在地方。使用iconv解决了这个问题。

编辑了所有细节的问题,案件结束了!