PHP: UTF 8 karakter kodlaması

5 Cevap php

Ben RSS cURL kullanarak beslemeleri listesini kazıma yaşıyorum, ve sonra ben okuma ve SimpleXML ile RSS verilerini ayrıştırma duyuyorum. Sıralanan veri daha sonra bir mySQL veritabanına eklenir.

Ancak, http://dansays.co.uk/research/MNA/rss.php Ben karakterler doğru değil görüntüleme ile birkaç sorunlar yaşıyorum ilgili haber gibi.

Örnekler:

‘Guitar Hero: Van Halen’ Trailer And Tracklist Available

NV 10/10/09 – Salt Lake City, UT 10/11/09 – Denver, CO 10/13/09 –

Ben veritabanına koymadan önce veri htmlentitiesi ve htmlspecialchars kullanarak denedi, ama çözmek sorunu yardım görünmüyor.

Nasıl muhtemelen ben yaşıyorum bu sorunu çözmek olabilir?

Tavsiyelerin için teşekkürler.

Updated

Ben Greg önerilen ne denedim ve sorun hala burada ...

İşte PDO'de SET İSİMLERİ yapmak için kullanılan kod:

$dbh = new PDO($dbstring, $username, $password); 

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$dbh->query('SET NAMES "utf8"');

Ben o sıralanır ve veritabanına eklenmeden önce SimpleXML verilerle echo'ing biraz yaptım, ve ben şimdi cURL ile ilgili bir şey olduğuna inanıyorum ...

İşte cURL için ne var:

$ch = curl_init($url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);

curl_setopt($ch, CURLOPT_HEADER, 0);

curl_setopt($ch, CURLOPT_ENCODING, 'UTF-8');

$data = curl_exec($ch);

curl_close($ch);

$doc = new SimpleXmlElement($data, LIBXML_NOCDATA);

Issue Resolved

Ben "UTF-8" Bu sorunu çözmek için için RSS / HTML sayfasındaki içeriğin charset ayarlamak zorunda. Ben karakter sorunları ham veri hala orada olduğu gibi bu gerçek bir düzeltme değil sanırım. PHP6 bunun için uygun destek bekliyorum!

5 Cevap

Tüm hata ayıklama gibi, sorunu tecrit ederek başlayın:

I am scraping a list of RSS feeds by using cURL, - sorunu veriyor RSS beslemesi xml bakmak (birden fazla yem var, bu nedenle bazı beslemeleri doğru olması için bu mümkündür ve farklı şekillerde yanlış olması yanlış beslemeleri için)

and then I am reading and parsing the RSS data with SimpleXML. - SimpleXML okumak alanında yazdırmak - Tamam ya da bir sorun ortaya çıkıyor?

The sorted data is then inserted into a mySQL database. - hex (alan) yazdırmak, uzunluk (alan), ve sorunu veriyor veri parçası için char_length (alan).

DÜZENLEME

Besleme almak http://hangout.altsounds.com/external.php?type=RSS2, onaylayıcısı koydu http://validator.w3.org/feed/. Onlar iso-8859-1 olarak içerik türünü beyan ediyoruz ama böyle tırnak gibi gerçek içeriği, bazı CP1252 gibi bir şey - örneğin onlar sol teklifi temsil bayt 0x93 kullanıyorsanız - {[(2 )]}.

Peki ya bu can sıkıcı bu bazı araçları göstermek olmamasıdır - Firefox neler oluyor tahmin ve doğru tırnak göstermek gibi görünüyor ve daha fazla noktaya, SimpleXML utf8 içine 0x93 dönüştürür, bu nedenle 0xc293 olarak geldiği sorunu şiddetlendirir.

DÜZENLEME 2

Daha doğrusu biraz okumak için yem almak için bir geçici çözüm Basit XML geçirmeden önce "Windows-1252" ile "ISO-8859-1" değiştirmektir. Bu besleme bazı parçaları UTF8 olduğu ortaya çıkıyor, çünkü% 100 işe yaramaz.

Genel yaklaşım, onların beslemeleri düzeltmek için dünyadaki herkese olamayacağını varsayarak, siz hatalı biçimlendirilmiş veriler yayan oluyor dış sistemi ile arayüzü gerektiren ne geçici çözümler izole etmek ve merkeze utf8 saf berrak geçmek için Sisteminizin. Hatırlıyorum böylece ham dış yem tarihli bir kopyasını kaydedin ileride de geçici gerekli neden, ayırman ve almak ve değiştirmek kolaydır böylece geçici çözümü kod satırları açıklama ve eğer dış kuruluşun yem (düzeltir ya da) farklı bir şekilde kırar ve zaman zaman tekrar kontrol edin. Ne yazık ki yerine bir hata mevcut durumuna programlama yaparken, bu yüzden kalıcı, temiz bir çözüm var bir spec programlama - yapabileceğiniz en iyi izolattır, belge ve monitör.

Sayfanız yüzden veritabanında benim parmak işaret ediyorum UTF-8 olarak servis ediliyor.

Bağlantı herhangi SELECTleri veya ıNSERTlerden önce UTF-8 olduğundan emin olun - MySQL:

SET NAMES "utf8"

Ben Greg önerilen ne denedim ve sorun hala burada ...

İşte PDO'de SET İSİMLERİ yapmak için kullanılan kod:

$dbh = new PDO($dbstring, $username, $password); 

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$dbh->query('SET NAMES utf8');

Bu size bağlı bu özel yem için bu gibi görünüyor XML önsözünde, ile yapmak zorunda kalabilirsiniz:

<?xml version="1.0" encoding="ISO-8859-1" ?>

Bildiğim kadarıyla SimpleXML dayandığı libxml'e, bildiğiniz gibi, şeyler bu tür arar. Ben XML dosyaları hakkında emin değilim ama HTML dizeleri ile bu charset belirtmek META elemanlarının arar eminim.

(Ben HTML META etiketleri sıyırma bir kez benzer bir sorunu çözmüş) ve SimpleXMLElement onu beslemeden önce utf8_encode() veri unutma XML prolog sıyırma sahipsiniz.

O tüm karakter kodlaması olarak aynı değildir Accept-Encoding başlık, bulunuyor:. CURLOPT_ENCODING hakkında sadece hızlı bir notu Desteklenen kabul kodlamaları "Söndür" ve "gzip", "kimlik" vardır.