. Karakter kodlama sorunu - HttpWebRequest üzerinden NET tarafından okunan PHP çıktı,

4 Cevap ûnet

Ben sunucu üzerinde bazı dosyaların isimlerini ouputs bir PHP komut dosyası (bir Linux sunucu üzerinde çalışan) var. Bu basit bir salt metin biçiminde bu dosya adlarını verir.

Bu çıkış HttpWebRequest HttpWebResponse kullanarak bir program VB.NET okuma ve StreamReader edilir.

Sorun dosya adları çıktı olmanın bazı ... sıradışı karakterleri içeren olmasıdır. Özellikle, "Bölüm" sembolü (§).

Ben bir web tarayıcısında PHP komut dosyası çıkışını görüntülemek, sembol ince görünür.

Benim. NET programına PHP komut dosyası çıkışını okuduğumda, sembol (bu genel bir "blok" sembolü olarak görünür) doğru görünmüyor.

Ben (HttpWebResponse itibaren) yanıt akışı okurken kullanabileceğiniz tüm farklı karakter kodlama seçenekleri denedim. Ben bir TextBox (hiçbir iyi) görüntüleyerek, bir metin dosyası (iyi) doğrudan akışı çıktısı denedim, ve Visual Studio debugger doğrudan sonuçlarını görüntülerken bile, karakter gibi yerine bir blok olarak görünür "Bölüm" sembolü.

Ilgili bir soru önerdiği gibi "how do you troubleshoot character encoding problems.", (Bir onaltılık editörü çıktı muayene ettik

Ben. NET kendisinden bölüm sembolü (§) yazdığınızda, onu temsil görmek altıgen byte (bu unicode eğer mantıklı, değil mi? Iki bayt gerektirir?) "A7 c2" vardır. Iki yerine üç bayt - Ben doğrudan bir dosyaya PHP script çıktı yazmak ve bir hex editör ile bu incelediğinizde, sembol "ef bf bd" olarak gösterir?

Ben ne gibi bir kayıp değilim - Ben bu konuda belirgin bir şey eksik ise diğer bazı karakter kodlaması belirtmek, ya da gerekiyorsa.

İşte (bu yüzden bu sitede düzgün görünmesini modifiye VB-tarzı yorum) PHP komut çıktısını almak için kullanılan kod:


Dim myRequest As HttpWebRequest = WebRequest.Create("http://www.example.com/sample.php")

Dim myResponse As HttpWebResponse = myRequest.GetResponse()

// read the response stream
Dim myReader As New StreamReader(myResponse.GetResponseStream())

// read the entire output in one block (just as an example)
Dim theOutput as String = myReader.ReadToEnd()

Herhangi bir fikir?

  • Ben StreamReader yanlış tür kullanarak muyum? (Ben yeni StreamReader oluşturmak için çağrı karakter kodlamasını geçen denedim - Ben System.Text.Encoding olan tüm olanları denedim - UTF-8, UTF-7, ASCII, UTF-32, Unicode, vs)
  • Ben PHP komut dosyası çıkışını okumak için farklı bir yöntem kullanıyor olmalıdır?
  • Metin çıktısı zaman PHP tarafında farklı yapıyor olması gereken bir şey var mı?

UPDATED INFO:

  • utf8_encode($file);: PHP çıkışı özellikle arayarak UTF-8 kodlanmış
  • Ben. NET sembolü dışarı yazdığımda, kopyalanan ve Windows Karakter Haritası app sembolü yapıştırılan. Ben de kopyalanan & (Windows) dosyanın adını ve bu web sayfası kendisinden doğrudan yapıştırılan - (c2 A7) yazılır hepsi aynı onaltılık değerini vermiştir.
  • Evet, ben bahsediyorum "bölümünde sembolü" (Karakter Haritası göre Windows ALT 0167) U 00 A7.
  • Içerik türü PHP script başında header('Content-Type: text/html; charset=utf-8'); sağ aracılığıyla açıkça ayarlanır.

UPDATE:

Kendim anladım, ama ben cevap insanların yardımı olmadan bunu yapamazdım. Teşekkür ederiz!

4 Cevap

Figured it out!!

Bir çok şey gibi, geçmişe bakıldığında basit!

Jon Skeet doğru oldu - meant UTF-8 olacaktı, ama kesinlikle değildi.

Çıkıyor, (Ben debug daha basit yapmak için elimden önce) orijinal senaryoda ben kullanıyordum, bir utf8_encode() çağrısına sarılmış değil script tarafından bazı ek metin çıkış vardı. Bu tüm sayfa yerine UTF-8, ISO-8859-1 çıkış olmak neden.

Ben (Firefox, "Sayfa Bilgisi") benim test, senaryonun "kodlama" özelliğini kontrol ederken fark ettim. Bu test script için UTF-8 olduğunu, ancak ISO-8859-1. Üretim komut ayrıca dosyanın tarihini basılmış; Bu utf8_encode bir çağrı sarılmış değil - ve bütün çıkış ISO-08859-1 değiştirmek için neden oldu.

[Burada alnımı tokat bana ses ekleme]

Cevap herkese teşekkürler! Sen çok yararlı!

PHP tüm kodlama üzerinde kontrol verir mi? Bu genellikle sadece ona sanırım iyi bir fikir değil.

Eğer. NET sembolü yazdım derken, ne kodlama kullandığınız? Ne gerçek Unicode kod noktası nedir? unicode U+00A7 bir bölümü sembol var - Eğer birini demek olduğunu? Ben PHP olsa "ef bf bd" olarak beyan neden hiçbir fikrim yok.

Bir StreamReader kullanırken ince olmalıdır, ancak doğru kodlamayı bilmeniz gerekir.

EDIT: Tamam, kesinlikle meant UTF-8 olması bu yüzden değil - yani sorun PHP tarafında olduğunu. Ne olur (web sunucusu şekilde almadan) açıkça sonucu bayt yazdırmak ardından utf8_encode($file) çalıştırın ve eğer? Ben bir tarayıcı olsa ... bu sadece düz HTML sağ sembol almak yönetmek olduğunu gerçekten şaşırdım? Eğer "ef bf bd" hepsi sadece bölümü sembolü olduğunu emin misin?

Bu web sunucusu kamu yerde mi? Ben benim tarayıcı işaret olsaydı, ben might oluyor ne çalışmak mümkün.

Ince, utf8_encode($file) kullanıyorsanız, ancak PHP de UTF-8 olarak içerik türünü dönüyor? Eğer PHP sayfası tarafından döndürülen Content-Type başlığını kontrol edebilirsiniz? Siz özellikle emin böyle bir şey var yapmak için charset alanına bakmak gerekir:

Content-Type: text/html; charset=utf-8

Ben. NET (haklı veya haksız) başarısız ise bir tarayıcı düzgün karakteri görüntüleyen nasıl olabileceğini görebilirsiniz. Tarayıcılar genellikle sağlam ve mümkün olduğunca bağışlayıcı olmaya çalışın. Kullandığınız tarayıcı karakter dizilerinden gerçek karakter kodlamasını çıkarım olabilir.

Ben bunu aşağıdaki ile bir dosya oluşturmak kolay bir çözüm yarattı yukarıda tavsiye kullanarak:

$feed = header("Content-Type: text/html; charset=utf-8");
$feed.=utf8_encode(readfile(rawurldecode($_GET["url"])));
$feed = fread(rawurldecode($_GET["url"]));
die($feed);

Bu PHP ancak kolayca başka bir dile taşıdık olabilir. Sonra sadece [(0)] yani {gibi değişken olsun URL sorunlu dosyanın URL ile (ben bir RSS beslemesi bunun için dolayısıyla benim ihtiyacı ile ilgili bir sorun bulundu) olduğunu UTF8 sorunlarına neden olup kullanmak istediğiniz herhangi bir URL çağrı }

Bu daha sonra başka bir dosya olarak dosya yüklemek ve size dönecektir ki böyle bir ekran okuyucu gibi başka bir şey içine yükleyebilirsiniz sorun olmadan. Siz benzer içeri sorun koduna sahip bir dize ya da başka ne olursa olsun okumak için değiştirebilirsiniz olabilir