PHP aksanlı karakterleri okuma Sorunu

3 Cevap php

PHP arazi garip bir sorun var. İşte tam olmayan bir örnek:

    $handle = fopen("file.txt", "r");
    while (($line = fgets($handle)) !== FALSE) {
        echo $line;
    }
    fclose($handle);

Örnek olarak, ben bu gibi görünen bir dosya varsa:

Lucien Frégis

Sonra komut satırından çalıştırmak Yukarıdaki kod ama onun yerine ben olsun bir e akut, aynı adı verir:

Lucien FrÚgis

Ben söz konusu bayt ben default_charset geçerli değerini çıktısı ile teyit PHP'nin varsayılan kodlama (ISO-8859-1) e akut için ne beklenir E9 olduğunu görmek dosyanın hex dökümü bakıyor.

Herhangi bir düşünce?

EDIT:

Önerdi, ben (... ama 0xE9 o şekilde görüntülenen neden explane yok) pencereler kod sayfasını kontrol, ve görünüşe göre onun 850, eskimiş olan ettik

3 Cevap

0xE9 iso-8859-1 in é için kodlama. Ayrıca aynı karakter için unicode codepoint bulunuyor. Konsol (Böyle cp-850 gibi) farklı bir kodlama çıktı yorumlaması, daha sonra aynı byte böylece ekranda farklı bir karakter göstererek, farklı bir codepoint çevirmek olacaktır. Eğer the code page for cp-850 bakarsanız, size byte 0xE9 Ú çevirir görebilirsiniz (Unicode kodlaması 0xDA). Yani temelde konsol yanlış bayt yorumlar. Ben nasıl emin değilim, ama iso-8859-1 için konsol charset değiştirmek gerekir.

Komut satırında php çalıştırmadan önce, komut çalıştırmayı deneyin:

chcp 1252

Bu beklediğiniz gibi aksanlı karakterler birine kod sayfasını değiştirmek olacaktır.

850 ve 1252 kod sayfaları arasındaki fark için aşağıdaki bağlantılara bakın:

http://en.wikipedia.org/wiki/Code_page_850

http://en.wikipedia.org/wiki/Windows-1252

Aksan unicode veriler düşünülebilir ve o şekilde saklamak gerekir. utf_decode , utf_encode , and iconv fonksiyonları bir göz atın.

Hayır bekle, o ISO 8859-1 charset olduğunu. Bilmiyorum. Ikili modda okuma veya file_get_contents kullanarak denediniz mi?