Bir soru işareti ile küçük siyah elmas gösteren PHP çıktı

7 Cevap php

Ben bir veritabanı kaynağından çeker bir php program yazıyorum. VARCHARS bazıları onlara bir soru işareti olarak siyah elmas gösterdiklerini tırnak (REPLACEMENT CHARACTER, Microsoft Word, metin varsayalım).

Nasıl ben bu karakterleri şerit php kullanabilir?

7 Cevap

Bu bir charset konudur. Gibi, birçok farklı düzeylerde yanlış gitmiş olabilir, ancak büyük olasılıkla, sizin veritabanında dizeleri utf-8 kodlanmış ve iso-8859-1 olarak sunuyoruz. Ya da tersi.

Bu sorunu gidermek için doğru yolu, karakter setleri düz elde etmektir. Basit strateji, PHP kullanarak konum beri, sizin uygulama boyunca iso-8859-1 kullanmaktır. Bunu yapmak için, emin olmalısınız:

Zaten veritabanında veri varsa, muhtemelen zaten berbat farkında olmalıdır. Eğer üretim aşamasında zaten değilseniz, sadece tüm silin ve baştan başlayın. Aksi takdirde bazı veri temizleme yapmanız gerekecek.

A note on meta-tags, since everybody misunderstands what they are:

When a web-server serves a file (A HTML-document), it sends some information, that isn't presented directly in the browser. This is known as HTTP-headers. One such header, is the Content-Type header, which specifies the mimetype of the file (Eg. text/html) as well as the encoding (aka charset). While most webservers will send a Content-Type header with charset info, it's optional. If it isn't present, the browser will instead interpret any meta-tags with http-equiv="Content-Type". It's important to realise that the meta-tag is only interpreted if the webserver doesn't send the header. In practice this means that it's only used if the page is saved to disk and then opened from there.

This page bu şeyler çok iyi bir açıklaması var.

Eğer bu karakteri (U + fffd "DEĞİŞTİRİLMESİ KARAKTER") görürseniz genellikle metin kendisi tek bayt kodlama bazı şeklinde kodlanmış ancak unicode kodlamaları (UTF8 veya UTF16) birinde yorumlandığı anlamına gelir.

Öyle olsaydı çevresindeki diğer yolu (genellikle) bu gibi bir şey olacaktır: Ã ¤.

Muhtemelen orijinal kodlama da Latin-1 olarak bilinen, ISO-8859-1. Sen senaryoyu değiştirmek zorunda kalmadan bu kontrol edebilirsiniz: Tarayıcılar size farklı bir kodlama bir sayfayı yeniden yorumlamak için seçeneği sunar -> "Karakter Kodlaması" - Firefox'ta "View" kullanın.

Tarayıcı doğru kodlamayı kullanmak yapmak için, bu gibi bir HTTP üstbilgisi eklemek:

header("Content-Type: text/plain; charset=ISO-8859-1");

ya da bir meta etiketi kodlama koydu:

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

Alternatif başka bir kodlama (UTF-8, tercihen) veritabanından okumak veya iconv() ile metne dönüştürmek için deneyebilirsiniz.

Ben de bu sorunla karşı karşıya. Ben, UTF8 karakterleri kesmek UTF8 dize substr() kullanan, böylece kesilmiş karakter düzgün görüntülenemiyor. mb_substr($utfstring,0,10,'utf-8'); yerine kullanın. Bu çözelti, tabii ki, on stackoverflow ;) bulundu

Bir zamanlar vardı diğer sorun UTF8 dize htmlspecialchars() kullanıyordum. Burada kullanmak zorunda kaldı: htmlspecialchars($utfstring, ENT_QUOTES, 'UTF-8');

Belki de bu ek bilgileri başkalarına yardımcı olacaktır.

Problem senin açıklamasına dayanarak, veritabanındaki verilerin neredeyse kesinlikle Windows-1252 olarak kodlanmış, ve sayfa neredeyse kesinlikle ISO-8859-1 olarak servis ediliyor. Bu iki karakter setleri, Windows-1252 sol ve sağ kaşlı tırnak işaretleri dahil, ISO-8859-1 bulunmayan 16 ekstra karakter, sahip olması dışında eşdeğerdir.

Benim analiz doğru olduğunu varsayarak, en basit çözüm, Windows-1252 sayfanızı hizmet etmektir. ISO-8859-1 olan tüm karakterler, Windows-1252 de, çünkü bu işe yarayacak. Aşağıdaki gibi PHP Eğer kodlamasını değiştirebilirsiniz:

header('Content-Type: text/html; charset=Windows-1252');

Ancak, gerçekten sizin HTML dosyaları ve veritabanı içeriği kullanarak ne karakter kodlama kontrol ve tutarlı olmaya özen, ya da bu mümkün olmadığı durumlarda doğru dönüştürmek gerekir.

Bu unicode veya diğer charset uyumsuzluğu neden olabilir. Ayarları metin Tamam bakacağız, tarayıcınızda charset değiştirmeyi deneyin. Sonra veritabanı içeriğini görüntülemek için kullanmak charset dönüştürmek için nasıl soru. (Hangi aslında sadece çıkış için utf-8 charset ifadesi eklenerek yapılabilir.)

Ayrıca tarayıcınızda ayarlanan caracter değiştirebilirsiniz. Sadece hata ayıklama nedenlerle.

MYSQL bağlantısı (kullandığınız ne bağlı veya latin1) UTF-8 için ayarlanmış olduğundan emin olmak için, bunu yapabilirsiniz:

$con = mysql_connect("localhost","username","password");    
mysql_set_charset('utf8',$con);

veya kullandığınız hangi charset kontrol etmek için bunu kullanın:

$con = mysql_connect("localhost","username","password");   
$charset = mysql_client_encoding($con);
echo "The current character set is: $charset\n"; 

Burada daha fazla bilgi: http://php.net/manual/en/function.mysql-set-charset.php