SORU
23 Aralık 2010, PERŞEMBE


Nasıl bir metin dosyasının karakter kodlamasını algılamak için?

Benim dosyada kullanılan algılamaya çalışıyorum.

Bu kod ile standart kodlama almaya çalışın

public static Encoding GetFileEncoding(string srcFile)
    {
      // *** Use Default of Encoding.Default (Ansi CodePage)
      Encoding enc = Encoding.Default;

      // *** Detect byte order mark if any - otherwise assume default
      byte[] buffer = new byte[5];
      FileStream file = new FileStream(srcFile, FileMode.Open);
      file.Read(buffer, 0, 5);
      file.Close();

      if (buffer[0] == 0xef && buffer[1] == 0xbb && buffer[2] == 0xbf)
        enc = Encoding.UTF8;
      else if (buffer[0] == 0xfe && buffer[1] == 0xff)
        enc = Encoding.Unicode;
      else if (buffer[0] == 0 && buffer[1] == 0 && buffer[2] == 0xfe && buffer[3] == 0xff)
        enc = Encoding.UTF32;
      else if (buffer[0] == 0x2b && buffer[1] == 0x2f && buffer[2] == 0x76)
        enc = Encoding.UTF7;
      else if (buffer[0] == 0xFE && buffer[1] == 0xFF)      
        // 1201 unicodeFFFE Unicode (Big-Endian)
        enc = Encoding.GetEncoding(1201);      
      else if (buffer[0] == 0xFF && buffer[1] == 0xFE)      
        // 1200 utf-16 Unicode
        enc = Encoding.GetEncoding(1200);


      return enc;
    }

Beş benim ilk bayt 60, 118, 56, 46 ve 49.

Bu beş ilk bayt maçları gösteren bir çizelge var mı?

CEVAP
23 Aralık 2010, PERŞEMBE


Dosyadaki BOM sahip güvenemezsin. UTF-8 gerektirmez. Ve non-Unicode kodlama bile bir malzeme listesi yok. Ancak, kodlama tespit etmenin başka yolları da var.

UTF-32

BOM 00 00 FE FF (OLMAK için) ya da 00 00 FF FE (LE).

Ama UTF-32 bile kolay bir BOM olmadan tespit etmektir. Çünkü bu Unicode kod noktası aralığı kısıtlı U 10FFFF ve böylece UTF-32 adet hep deseni 00 {0 x|10} xx xx (için) veya xx xx {0 x|10} 00 (LE). Eğer veri 4, ve bu kalıplardan biri şöyle katı bir uzunluğa sahip, güvenli bir şekilde UTF-32 olduğunu farz edebilirsiniz. Yanlış pozitif bayt odaklı kodlamalar 00 bayt nadir nedeniyle neredeyse imkansız.

US-ASCII

Hiçbir BOM, ama buna gerek yok. ASCII kolayca 80-FF aralığında bayt eksikliği tespit edilebilir.

UTF-8

BOM EF BB BF. Ama bu güvenilir bir şey değil. UTF-8 dosyaları birçok özellikle Windows olmayan sistemlerde kökenli bir malzeme listesi yok.

Ama eğer bir dosya UTF-8 olarak doğrular güvenle varsayabilirizUTF-8. Yanlış pozitif sonuçlar nadirdir.

Özellikle, veri ASCII olmadığı göz önüne alındığında, 2-bayt sırası için bir yanlış pozitif oranı yalnızca yüzde 3.9 (1920/49152). 7-bayt sırası için, %1'den daha az. 12-bayt sırası için, %0,1'den daha az. 24-bayt sırası için, 1 milyon daha az.

UTF-16

BOM (OLMASI için) veya FE FF FF FE (LE). UTF-16LE BOM check-32, UTF ilk UTF-32LE BOM başında bulunan, unutmayın.

-16 UTF BOM olmadan dosya olabilir, ama çok zor onları tespit etmek olacaktır. Yalnızca güvenilir bir şekilde tanımak UTF-16 olmadan bir BOM olduğunu bakmak için çiftlerini (D[8-B]xx D[C-F]xx), ama non-BMP karakterler çok nadiren kullanılan bu yaklaşım pratik.

XML

Eğer dosya bayt 3F 78 6 d 6C 3C ile başlıyorsa (örneğin, ASCII karakterleri "<?"xml), encoding= bir beyan için bak. Eğer varsa, o zaman kodlama kullanın. Yok eğer, o zaman varsayılan XML kodlaması olan UTF-8, varsayalım.

Eğer EBCDIC destek gerekiyorsa, ayrıca eşdeğer sırası 4C 6F A7 94 93 arayın.

Eğer bir kodlama bildirimi içeren bir dosya biçimi varsa, genel olarak, daha sonra kodlama tahmin etmeye çalışmak yerine, bu bildiri için bak.

Yukarıdakilerin hiçbiri

Daha fazla çaba tespit etmek için gerekli olan diğer kodlamalar, yüzlerce vardır. Mozilla's charset detector a .NET port of it çalışıyor tavsiye ederim.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Caroline Saquet

    Caroline Saq

    1 EKİM 2011
  • KarnasCamillo

    KarnasCamill

    24 EKİM 2007
  • Tire Rack

    Tire Rack

    31 Mayıs 2007