Dosya kodlamasını alın [yinelenen]

5 Cevap php

Possible Duplicate:
Detect file encoding in PHP

Nasıl bir dosya var kodlayan hangi dosya PHP ile anlamaya?

5 Cevap

(Her 8 bitlik bayt dizisi geçerli utf-8 olduğu için) ve genellikle kodlama tespit edileceği için metnin anlamsal bilgi gerektirir kodlamayı algılama tüm 8 bit karakter setleri ama utf-8 için gerçekten zor.

Düşünün: Belli bir düz metin bilgisi ilişkilendirilmiş hiçbir kodlama bilgisi ile bayt sadece bir demet. Eğer herhangi bir bayt bakarsanız, o kadar kodlamasını tespit bir şans var, anything anlamına gelebilir, diğer bayt bağlamında bu bayt bakmak ve {olası dayalı bazı buluşsal denemek gerekir [(1)]} bileşimi.

8bit karakter setleri için olsa emin olamaz.

Yanlış gidiyor sezgisel bir gösteri örneğin burada:

http://www.hoax-slayer.com/bush-hid-the-facts-notepad.html

Bazı 16bit setleri, onlar bir bayt düzen işareti eklemek veya her saniye bayt 0'a ayarlanmış olabilir, çünkü tespit bir şans var.

Sadece UTF-8 algılamak istiyorsanız, kullanmak ya da daha önce açıklandığı gibi mb_detect_encoding edebilir, ya da bu kullanışlı küçük işlevini kullanabilirsiniz:

function isUTF8($string){
    return preg_match('%(?:
    [\xC2-\xDF][\x80-\xBF]        # non-overlong 2-byte
    |\xE0[\xA0-\xBF][\x80-\xBF]               # excluding overlongs
    |[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}      # straight 3-byte
    |\xED[\x80-\x9F][\x80-\xBF]               # excluding surrogates
    |\xF0[\x90-\xBF][\x80-\xBF]{2}    # planes 1-3
    |[\xF1-\xF3][\x80-\xBF]{3}                  # planes 4-15
    |\xF4[\x80-\x8F][\x80-\xBF]{2}    # plane 16
    )+%xs', $string);
}

mb_detect_encoding işi yapmak gerekir.

http://us.php.net/manual/en/function.mb-detect-encoding.php

Bu varsayılan ayarı var, sadece, UTF-8, ASCII tespit edeceğiz, ve bir kaç Japon JIS varyantları. Bu onları el belirtirseniz, daha kodlamaları algılamak için yapılandırılabilir. Bir dosya ASCII ve UTF-8 hem de ise, UTF-8 dönersiniz.

Dosya tür yeterli bir yere içine söylemek için sürece, gerçekten yapamam.

Web tarayıcı kullanılıyveyasa hangi kodlama bilir ki, örneğin, HTML dosyaları, en yakın bir içerik türü meta etiketi içeren içindir .. örneğin

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

veya

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Orada dosyasına bakarak ve bazı kodlamaları önermek bayt dizileri tespit ederek tahmin etmeye çalışın yöntemlerdir, ancak bu gerçekten sadece tahmin edilmektedir.

Sen "magic number" için dosyanın ilk birkaç bayt bakmak için fread () işlevini kullanın ve sonra dosya türleri için bilinen sihirli numaraları listesine karşı bu sihirli sayı eşleyebilirler.

BlackAura önerisi, IMHO çok iyi.

Başka bir seçenek sistemi () ya da benzeri kullanılarak, söz konusu dosya (1) file aramak. Genellikle, bu da size kodlama söylemek mümkün değildir. Bu herhangi bir aklı başında UNIX ortamında mevcut olmalıdır.