SORU
16 Kasım 2010, Salı


Nasıl güvenilir MacRoman arasındaki kodlama, CP1252, Latin1, UTF-8 ve ASCII tahmin

İş yerinde hiçbir hafta hiç kodlama ile ilgili panik, felaket, felaket ya da bazı olmadan geçer gibi görünüyor. Sorun genellikle güvenilir “text” kodlama belirtmeden dosya. bir süreç isteyen programcılar türetilmiştir Ama yapamazsın.

Hiç *.txt *.text ile biten isimler zorunda korusun dosyaları bundan böyle bu yüzden karar verildi. Düşünme bu uzantıları sıkıcı bir gönül kodlamaları konusunda rahat programcı yanıltmak ve bu uygun olmayan kullanım yol açar. Hiç olmaması daha iyi olurdu neredeyse tüm, en azından, çünkü o zaman uzatmabiliyorumne var bilmiyorsun.

Ancak, o kadar ileri gitmeye goint değiliz. Bunun yerine kodlama biten bir dosya adı kullanmak için beklenir. Örneğin metin dosyaları için, bu*2, *, README.utf8, **3 vb gibi bir şey olur.

Eğer bir Perl veya Python gibi dosyayı kendi içinde kodlama belirtin eğer belirli bir uzatma talep dosyalar için, o ne isterse onu yapacaksın. Böyle bir tesis dosyaya dahili bulunduğu Java gibi kaynak dosyaları için, uzantısı, SomeClass-utf8.java gibi önce kodlama koyacağız.

Çıkış için, UTF-8 olacakgüçlütercih etti.

Ama giriş için, bizim kod temeli dosyaları *.txt adlı binlerce ile başa çıkmak için nasıl anlamaya ihtiyacımız var. Hepsi yeni standart uyması için yeniden adlandırmak istiyoruz. Ama muhtemelen hepsini görüyoruz. Gerçekten çalışan bir kütüphane ya da bir programa ihtiyacımız var.

Bu değişik ASCII, ISO-8859-1, UTF-8, CP1252, ya da Apple MacRoman Microsoft. Olmamıza rağmen eğer bir şey ASCII olup olmadığını söyleyebiliriz biliyorum, Ve eğer bir şey muhtemelen 8-bit kodlamaları hakkında kafamız karıştı UTF-8, Eğer bilmek iyi bir değişiklik duruyoruz. En masaüstü Mac'ler ile karışık, Unix (Solaris, Linux, Darwin) çalışan olduğumuz için, pek çok can sıkıcı MacRoman bir dosya var. Ve bu özellikle bir sorundur.

Bir süredir programlı belirlemek için bir yol arıyordum

  1. ASCII
  2. ISO-8859-1
  3. CP1252
  4. MacRoman
  5. UTF-8

bir dosya olduğunu ve güvenilir bir şekilde üç farklı 8-bit kodlamaları bu yanlışı ayırt edebilecek bir program veya bir kütüphane bulamadım. Muhtemelen yalnız binden MacRoman dosyaları var, biz onu o koklamak için mümkün olmalı. Baktım hiçbir hile yönetebilir. ICU charset detector library için büyük umutlarım vardı ama MacRoman kolu. Ayrıca her iki Perl ve Python aynı şeyleri yapmak modüller baktım ama tekrar tekrar hep aynı hikaye: tespit MacRoman desteği yok.

Bu nedenle aradığım şeyi bir dosyada—tercihen daha fazla daha güvenilir bir şekilde belirler varolan bir kütüphane ya da bir programdır. Özellikle üç arasında ayrım vardır 3-bit atıf yaptım kodlamaözellikle MacRoman. Dosyaları daha 99% İngilizce metin; diğer dillerde birkaç, ama çok değil.

Eğer kütüphane kod varsa, bizim dil tercihi Perl, C, Java, Python, ve bu sırayla. Eğer sadece bir program varsa, o zaman gerçekten tam kaynak geliyor, Unix üzerinde çalışan ve tamamen özgür olduğu sürece içinde ne olduğu umrumuzda değil.

Zilyon eski metin dosyaları bu sorun rasgele kodlanmış oldu mu? Eğer öyleyse, nasıl olduğunu nasıl çözmek ve yapmaya çalıştınız mı? Bu en önemli yönü benim soru, ama ben de ilgi ister sence teşvik programcılar adı (veya yeniden) dosyaları ile gerçek kodlama dosyaları olarak bize yardım etmesini önlemek sorunu gelecek. Kimse kurumsal olarak bu uygulamak için çalıştı, ve eğer öyleyse, oldububaşarılı ya da değil, ve neden?

Ve evet, ben bir sorunun doğası göz önüne alındığında kesin bir cevap garanti neden tam olarak anlamak. Bu devam etmek için yeterli veri yok özellikle küçük dosyalar ile durum böyledir. Neyse ki, bizim dosyalar nadiren küçük. README rastgele dosya dışında, en çok 250 bin, 50 bin, boyut aralığında ve çok daha büyüktür. Her şey bir kaç K daha fazla boyutu İngilizce olması garanti edilir.

Sorun etki alanı biyomedikal metin madenciliği, bazen PubMedCentral Açık Erişim respository gibi geniş ve son derece büyük penis ile anlaşma, bu yüzden. Oldukça büyük bir dosya BioThesaurus 5.7 GB 6.0. Bu dosya, çünkü bu özellikle sinir bozucuneredeysetüm UTF-8. Ancak, bazı mankafa gitti ve bazı 8-bit kodlama—Microsoft CP1252, inanıyorum ki bu bir kaç satırı kalmış. Sana yolculuğa çıkmadan önce uzunca bir süre alır. :(

CEVAP
17 Kasım 2010, ÇARŞAMBA


İlk olarak, kolay davaları:

ASCII

Eğer verilerinizi 0x7F, yukarıdaki bayt içeriyorsa ASCII. (Veya 7-bit İSO646 bir kodlama, ama o çok eskidir.)

UTF-8

Eğer veriler UTF-8 olarak doğrular güvenli bir şekilde kabul edilebilirUTF-8. UTF-8 kesin doğrulama kuralları nedeniyle yanlış pozitif son derece nadirdir.

ISO-8859-1 vs windows-1252

Tek fark, bu iki grup arasındaki kodlamaları ISO-8859-1 C1 kontrol karakterleri windows-1252 sahip yazdırılabilir karakterler €'ƒ"...†‡ˆ‰HTTP: / / "ŒŽ"""•--™http: / / "œžŸ. Kıvırcık tırnak kullanan dosyaları bol veya tire, ama C1 kontrol karakterleri kullanan hiç görmedim. Bu yüzden bile onları rahatsız etmeyin, ya da ISO-8859-1, windows-1252 yerine algılar.

Şimdi tek bir soru kalıyor.

Nasıl cp1252 gelen MacRoman bir ayırım yapıyor musunuz?

Bu çok daha zor.

Tanımsız karakterler

Bayt 0x81, 0x8D, 0x8F, 0x90, 0x9D windows-1252 olarak kullanılmaz. Eğer bunlar ortaya çıkarsa, o zaman veri MacRoman olduğunu varsayalım.

Aynı karakterler

Hem kodlamaları ile aynı olmasına bayt 0xA2 (¢), 0xA3 (TL), 0xA9 (©), 0xB1 (±), 0xB5 (µ). Eğer bu ASCII olmayan tek bayt, MacRoman veya cp1252 hangisini seçerseniz seçin önemli değil.

İstatistiksel yaklaşım

Karakter sayısı (bayt!) UTF-8 olduğunu bildiğiniz veri frekansları. En sık karakter belirleyin. Daha sonra bu veri cp1252 veya MacRoman karakterler daha yaygın olup olmadığını belirlemek için kullanın.

Sadece 100 rasgele İngilizce Wikipedia makaleler üzerinde yapılan bir arama, örneğin, en yaygın ASCII olmayan karakterler ·•–é°®’èö—. Bu gerçekten yola çıkarak

  • Bayt 0x92, 0x95, 0x96, 0x97, 0xAE, 0xB0, 0xB7, 0xE8, 0xE9 veya 0xF6 windows-1252 öneririz.
  • Bayt 0x8E, 0x8F, 0x9A, 0xA1, 0xA5, 0xA8, 0xD0, 0xD1, 0xD5 veya 0xE1 önermek MacRoman.

Cp1252-düşündüren baytları sayar ve MacRoman-düşündüren bayt, ve en çok hangisi ile gitmek.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Damian Winter

    Damian Winte

    27 ŞUBAT 2007
  • Lin Steven

    Lin Steven

    17 EKİM 2006
  • Neil Cicierega

    Neil Ciciere

    22 Mart 2006