PHP: 2 dizeleri - bir UTF-8 ve biri değildir?

2 Cevap php

Ben dizeleri dolu bir veritabanı var. Bazıları doğru UTF-8 kodlanmış bazıları değildir. Bu nedenle, ben db 100 dizeleri seçen bir senaryo kurdum. Aşağıdaki fonksiyonu (doğru ise olursa olsun) bir dize UTF-8 ya da içeren karar verir:

function detectUTF8($text) {
    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',
    $text);
}

Senaryonun çıkışı UTF-8 içeren bu dizeleri ve - bir satır aradan sonra - utf8_decode () dize. Bazı dizeleri çift kodlanmış olduğundan, ben orada görebiliyorum tüm dizeleri deşifre.

Sonuç 2 dizeleri her bazı girişleri ile bir listesi: bir diğeri yanlış, doğru. Bunu görebilirsiniz here. Ama nasıl doğru hangisinin belirliyorsunuz?

Bana yardımcı olur umarım. Şimdiden teşekkürler!

2 Cevap

Sen utf8_decode kullanmak ve hala geçerli UTF-8 ise sizin detectUTF8 fonksiyonu ile kontrol edebilir.

mb_detect_encoding ($ metin, "UTF-8");

Sen --enable-mbstring ile php kurmak veya yum / apt ile php-Mbstring paketini yüklemek zorunda kalabilirsiniz, ama php sen multibyte dize kodlamasını tespit yardımcı olabilir.