Doğru bir karakter kodlaması ile Yardım

4 Cevap php

A, E, I, O, U: Ben bazen aksanlı karakterler ile sunulan bir HTML formu var

Ben Open Office veya Word ile açıldığında, bazı funky olsun karakterler iyi görünüyorsun, ama ben bir metin editörü (örneğin vim veya not defteri) olarak CSV formatında baktığınızda, CSV formatında bu form gönderimleri ihraç bir PHP komut dosyası var Sonuçlar:

Ben de salesforce bu gönderme geçirerek ve bir hata alıyorum: "varlık" Atilde "ilan başvurulan, ama değildi."

Ne benim CSV dosyasının taşınabilirliği sağlamak için ne yapabilirim? Kodlaması işlemek için doğru yolu nedir?

My HTML file is content-type is set as: Content-Type: text/html; charset=utf-8 Data is being stored in MySQL as latin1_swedish_ci collation.

4 Cevap

Toplam kodlama karışıklık! :-)

The table character set

MySQL tablo karakter seti tek kodlama MySQL dahili kullanmanız gerektiğini belirler ve böylece karakter aralığı izin.

  • Latin-1 olarak ayarlarsanız (aka ISO 8859-1), masanızda uluslararası karakterleri depolamak mümkün olmayacaktır.
  • Önemlisi, karakter seti PHP ile iletişim kurarken MySQL kullandığı kodlamayı etkilemez.
  • Tablo collation sıralama için kuralları belirler.

The connection character set

MySQL connection character set Eğer tablo veri almak kodlama belirler (ve MySQL veri göndermek gerekir).

  • Kodlama SET İSİMLERİ, örneğin ile ayarlanır SET NAMES "utf8".
  • Bu tablo, kodlamayı uymuyorsa, MySQL otomatik olarak anında veri dönüştürür.
  • Bu sayfa karakter setini uymuyorsa, sen örneğin kullanılarak elle PHP karakter kümesi dönüşümü gerçekleştirmek zorundayız utf8_encode veya mb_convert_encoding.

Page character set

Content-Type header ile belirtilen sayfası karakter seti, PHP komut dosyası çıkışını yorumlamak nasıl tarayıcı söyler.

  • Eğer tarayıcınızın içinde dosyayı kaydederken bir HTTP başlığı olarak, kaydedilmez. Bilgi, böylece OpenOffice veya diğer programlar için kullanılabilir değildir.

Recommendations

İdeal olarak, her üç yerde aynı şifrelemeyi kullanmalıdır ve ideal, kodlama UTF-8 olmalıdır.

Dosya biçimi kodlayan bilgi içermez Ancak, CSV, sorunlara neden olur. Bu kodlama tahmin etmek kadar uygulama ve böylece, gördüğünüz gibi, tahmin yanlış olur.

  • Ben OpenOffice hakkında bilmiyorum, ama Microsoft Office, Windows genellikle Latin-1 anlamına gelir "ANSI" kodlama, (veya CP1252 belirli olması) üstlenecek.
  • ";" Office sonra kullanarak geçer beri Microsoft Office ayrıca, countries that use "," as a decimal separator sorunlara neden olur CSV dosyaları için bir alan ayırıcı olarak.

En iyi bahis CSV dosyası için Latince-1 kullanmaktır. Ben hala tablo için UTF-8 kullanmak istiyorum ve bağlantı karakter HTML sayfaları için de UTF-8 olsa ayarlar, ve.

Eğer (SET NAMES "utf8" bağladıktan sonra yürüterek) belirlenen bağlantı karakter için UTF-8 kullanıyorsanız, Latin-1 dönüştürmek için utf8_decode yoluyla metni çalıştırmak gerekir.

That entity problem

Ben de salesforce bu gönderme geçirerek ve bir hata alıyorum: "varlık" Atilde "ilan başvurulan, ama değildi."

Bu bir XML bağlamda HTML kodunu geçiyoruz gibi geliyor, ve karakter setleri ilgisi yoktur. Yoluyla metni çalıştırmayı deneyin html_entity_decode.

Ayrıca, hangi belge türü belirledik, değil mi?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

Doğru görünmüyor herhangi bir metin için htmlentities() işlevini kullanarak deneyin.

Siz de bir göz PHP Normalizer isteyebilirsiniz.

UTF-8 olarak CSV dosyasını yazarken emin olun. Eğer nasıl emin değilseniz http://www.php.net/manual/en/function.fwrite.php#55054 bakın.

(Ayrıca, sql tablo latin1 değil, utf8 kullanarak olmalıdır)

Bu sizin CSV dosyasını yazmak için kullanacağız hangi charset kodlama karar vermek size kalmış (ancak, unutmayın, sizin açınızdan bilinçli bir karar olmalıdır.)

Hangi karakter kodlaması kullanılır? CSV bir charset kodlama tanımlar gelmez - Yani bazı Unicode karakter kümesi, muhtemelen UTF8'den için gitmek istiyorum. Ama bazı tüketiciler CSV (Excel gibi) onunla mutlu olmayabilir. Eğer "Batılı" o latin1 DİLLER'de ya da varyantları (iso-8859-1 ya da iso-8859-15) ile sınırlı ise daha uygun bir olabilir. Ama sonra (her durumda, aslında) sizin özel kodlama için kullanıcı girişi dönüşüm düşünmek gerekir - ve ne geçersiz karakterler varsa yapmak.

(BTW: Aynı düşünce html-giriş-to-db dönüşüm için gidiyor - Eğer ne kendinizi sordu, veritabanı için Latin1 kullanıyorsanız kullanıcı türleri olmayan bir latin1 karakter, örneğin bir japon karakter?).