Hata: "Girdi kodlaması, uygun UTF-8 değil!"

6 Cevap php

Ben hatayı alıyorum:

parser error : Input is not proper UTF-8, indicate encoding ! Bytes: 0xED 0x6E 0x2C 0x20

Bir 3. parti bir kaynaktan simplexml_load_string kullanarak bir XML yanıtı işlemek için çalışırken. Ham XML yanıt içerik türü bildirmek yapar:

<?xml version="1.0" encoding="UTF-8"?>

Oysa XML gerçekten UTF-8 değil gibi görünüyor. XML içeriğinin dildeki İspanyol ve XML Dublín gibi kelimeler.

Ben kendi XML çözmek için 3. parti alamıyor değilim.

Nasıl XML-işlemini ön ve kodlama uyumsuzlukları düzeltebilirim?

Bir XML dosyası için doğru kodlamayı algılamak için bir yolu var mı?

6 Cevap

Sizin 0xED 0x6E 0x2C 0x20 byte karşılık "olarak," ISO-8859-1, böylece içerik, ISO-8859-1 UTF-8 değil gibi görünüyor. Bu konuda bir veri sağlayıcı söyleyin ve sizin için işe yaramazsa muhtemelen ya diğer insanlar için çalışmaz, çünkü, bunu düzeltmek için onlara sormak.

Şimdi yalnızca kullanmalısınız etrafında çalışmak için birkaç yolu vardır if you cannot load the XML normally . One of them would be to use utf8_encode(). Dezavantajı XML geçerli UTF-8 ve bazı ISO-8859-1 hem de içeriyorsa o zaman sonuç içerecek olmasıdır mojibake. Yoksa iconv() veya mbstring'i kullanarak UTF-8 UTF-8 dize dönüştürmek için çalışın, ve onlar sizin için bunu düzeltmek olacak umut olabilir. (Onlar değil, ama en azından sizin XML yükleyebilirsiniz böylece geçersiz karakterler göz ardı edebilirsiniz)

Yoksa, uzun yol almak ve doğrulamak / kendiniz dizileri düzeltebilirsiniz. Yani UTF-8 ile ne kadar aşina bağlı olarak bir süre alacaktır. Ben hiç bilmiyorum ancak belki de yapardı orada kütüphaneler vardır.

Her iki şekilde de, onlar bunu düzeltmek böylece onlar geçersiz veri gönderirken veri sağlayıcısı bildirir.


Burada kısmi bir düzeltme bulunuyor. Kesinlikle her şeyi çözmek değil, ama bunun bazı çözecektir. Sağlayıcınız eşyalarını tamir edene kadar sizin tarafınızdan almak için umarım yeterli.

function fix_latin1_mangled_with_utf8_maybe_hopefully_most_of_the_time($str)
{
    return preg_replace_callback('#[\\xA1-\\xFF](?![\\x80-\\xBF]{2,})#', 'utf8_encode_callback', $str);
}

function utf8_encode_callback($m)
{
    return utf8_encode($m[0]);
}

Ben kullanarak bu çözüldü

$content = utf8_encode(file_get_contents('http://example.com/rss.xml'));
$xml = simplexml_load_string($content);

XML dosyası indirmek ve örneğin açarsanız Defteri'nde + + bu kodlama UTF8'den daha başka bir şey ayarlanır görürsünüz - I'v xml ile aynı sorun kendim yaptırdım, ve editörü sadece te kodlama oldu :)

Dize <?xml version="1.0" encoding="UTF-8"?> belge kodlamasını kurmuyoruz, o validator veya başka bir kaynak için tek bilgi bu.

Yerine javascript kullanarak, sadece mysql_connect cümleden sonra bu kod satırını koyabilirsiniz:

mysql_set_charset('utf8',$connection);

Şerefe.

Eğer Firefox 3. parti XML kaynağı açmak ve kodlama olarak ne otomatik olarak algılar görebilir miyim? Belki düz eski kullanarak ISO-8859-1, UTF-16 veya başka bir şey.

Onlar olsa, UTF-8 olacak ve başka bir şey sunmak bildirirseniz, onların yem açıkça bozuldu. Böyle bir kırık yem etrafında çalışma (ben bazen kaçınılmaz biliyorum olsa bile) bana korkunç geliyor.

O "UTF-8 ISO-8859-1'e karşı" gibi basit bir durumda ise, ayrıca mb_detect_encoding() ile şansınızı deneyebilirsiniz.

Eğer xml UTF-8 olarak kodlanmış ama kötü karakterler içeriyor olduğundan eminseniz, ou bunları düzeltmek için bu fonksiyonu kullanabilirsiniz:

$content = iconv('UTF-8', 'UTF-8//IGNORE', $content);