PHP ve ASP farklı karakter kodu değerleri dönen MySQL Unicode karakterleri

2 Cevap php

PHP ve MySQL komut hem de erişilebilir gereken bir MYSQL veritabanı var, bu çoğu durumda çalışıyor, ancak bazı "özel" karakterleri örneğin çift ​​tırnak, kesme ASP komut doğru görüntülenmez.

Örneğin MySQL veritabanı bir Drupal kurulumu olduğunu ve metni "çift tırnak" (tırnak akıllı tırnak vardır ama yığın taşması üzerine dislay görünmemektedir) içeren bir alan bir tablo içerir. Bu bir php script güzel görüntüler, ancak bir ASP komut dosyası. Ben dize döngü PHP ve ASP hem de basit bir senaryo yazmış ve burada karakter kodları çıktıları yazdırmak ettik:

PHP

“ 147
A 65
32
d 100
o 111
u 117
b 98
l 108
e 101
32
q 113
u 117
o 111
t 116
e 101
” 148

ASP

� 8220
A 65
 32
d 100
o 111
u 117
b 98
l 108
e 101
 32
q 113
u 117
o 111
t 116
e 101
� 8221

Gördüğünüz gibi, çift tırnak PHP ve ASP farklı karakter olarak dışarı geliyor ve ASP olanları doğru render değildir.

Ben bir standart Drupal PHP 5 ile yüklemek kullanarak bir windows makinede MySQL 5 koşuyorum. ASP MySQL ODBC 3.51 Sürücüsü kullanır ve bir bağlantıyı açmak ve select deyimi çalıştırmak dışında PHP veya ASP ya da herhangi bir diğer komutları kaçmıyorum .

Edit burada istediği gibi asp script

Dim strConn, objConn, objRS, strQ
Dim i, strBody

strConn = "DRIVER={MySQL ODBC 3.51 Driver}; SERVER=" & strDBServer & "; DATABASE=studential; UID=" & strDBUser & ";PASSWORD=" & strDBPass & "; OPTION=3"

Set objConn = Server.CreateObject("ADODB.Connection")     
objConn.Open(strConn)

strQ = "select body from drupal_node_revisions where nid = 261"
Set objRS = objConn.Execute(strQ)

strBody = objRS("body")

For i = 1 To len(strBody)   	
    Response.write(Mid(strBody, i, 1) & " " & AscW(Mid(strBody, i, 1))  & "<br />")
Next

objRS.Close
objConn.Close

Set objRS = Nothing
Set objConn = Nothing

Further edit

Aşağıdaki satırda Doç ile AscW değiştirirken:

Response.write(Mid(strBody, i, 1) & " " & AscW(Mid(strBody, i, 1))  & "<br />")

Karakter kodları artık maç, ancak alıntı karakterler hala incorrctly gösterilecek. Benim sayfa utf-8 charset etiketi içerir, böylece utf-8 kodlamasını kullanarak değil, önce iyi bir şey olabilir - bu ne olabilir herhangi bir fikir ya da nasıl düzeltebilirim?

Yardımlarınız için teşekkürler,

Tom

2 Cevap

Unicode "SOL ÇİFT TIRNAK İŞARETİ" olan 8220 = 0x201C - ASP komut dosyası Unicode kullanıyor görünüyor. ASP komut dosyası, bu unicode dize geçerli bir kodlama çıktısı değil, ama biz tam olarak neden aşağı pin kodunu görmek zorundayız çünkü muhtemelen ekranda çöp görüyoruz.

Oluyor burada birkaç şey var gibi görünüyor:

Ben veritabanı, tablo drupal_node_revisions sütun gövdesi gerçekten bir Unicode karakter kümesi için ayarlanmış olduğunu kabul edeceğim. Ayrıca, ben gerçekten kod noktası U +201 C SOL ÇİFT TIRNAK İŞARETİ ile başladığı kabul ediyorum.

Şimdi, PHP Latin1 veritabanına bağlanma gibi görünüyor. Bu MySQL (MySQL "Latin1" gerçekten bir Windows-1252 anlamına gelir), Windows 1252 için okunan verileri dönüştürmek neden olur. Bu nedenle tek bir bayt 147 için ilk chracter dönüştürme. PHP bu çıktı Sonra, ben karakteri Latin1 varsayılan neden web sayfası kodlama, (siir) hemen hemen tüm göstermez tahmin ediyorum tarayıcılar, Windows-1252 gibi davranın. Bu nedenle, çift tırnak doğru şekilde görüntülemek, ama aslında iki hata, diğer Unicode karakterleri başarısız olmasına neden olur, hangi yapılmıştır:

  1. Siz bağlantısı SET NAMES utf8; yürütmek MySQL tüm bağlantı değişkenleri sağlamak (üç var!) UTF-8 çalışıyoruz gerekir.

  2. Sen web sayfasının içerik türü UTF-8 karakter kümesini gösterir sağlamak gerekir. Bu bir meta elemanı ile yapılabilir: <meta http-equiv="content-type" content="text/html;charset=utf-8">

ASP kod bazı Unicode kodlamada veritabanına bağlanmak gibi görünüyor. Bu ifadenin AscW(Mid(strBody, i, 1)) ilk karakter için 8220 döner gibi indidcated edilir. Çıktı sorunu, bilinmeyen karakter motifleri üreten HTML sayfasının charset muhtemelen uyumlu Unicode kodlama için varsayılan sol değil, olduğunu yine.

Ben Response.write() yöntemi karakter seti kodlaması kullanmak için ne belirler, veya beklediği takdirde dize zaten kodlanmış bilmek ASP hakkında yeterince bilmiyorum, bu yüzden bulmaktan ile yardımcı olamaz nasıl veri yolu bitirmek için Unicode temiz sonu emin olun.