İş yerinde, kodlamayla ilgili bazı çağrışımlar, felaketler veya felaketler olmadan hiçbir hafta geçmiyor gibi görünüyor. Sorun genellikle kodlamayı belirtmeden bir "metin" dosyasını güvenilir bir şekilde işleyebileceklerini düşünen programcılardan kaynaklanır. Ama yapamazsın.
Bu nedenle, dosyaların artık *.txt
veya ile biten isimlere sahip olmasının yasaklanmasına karar verildi *.text
. Buradaki düşünce, bu uzantıların sıradan programcıyı kodlamalarla ilgili sıkıcı bir gönül rahatlığıyla yanıltmasıdır ve bu da yanlış kullanımlara yol açar. En azından o zaman, çünkü neredeyse hiç yok uzantısı olması daha iyi olurdu biliyorum sen ne var bilmiyorum.
Ancak, o kadar ileri gitmeyeceğiz. Bunun yerine, kodlamayla biten bir dosya adı kullanmanız beklenecektir. Metin dosyaları için Bu nedenle, örneğin, bu gibi bir şey olurdu README.ascii
, README.latin1
, README.utf8
vb
Belirli bir uzantı talep eden dosyalar için, eğer biri Perl veya Python'da olduğu gibi dosyanın kendi içindeki kodlamayı belirleyebiliyorsa, o zaman bunu yapmalısınız. Dosya içinde böyle bir tesisin bulunmadığı Java kaynağı gibi dosyalar için, kodlamayı uzantının önüne koyarsınız, örneğin SomeClass-utf8.java
.
Çıktı için UTF-8 şiddetle tercih edilmelidir .
Ancak girdi için, adlı kod tabanımızdaki binlerce dosyayla nasıl başa çıkacağımızı bulmamız gerekiyor *.txt
. Yeni standardımıza uyacak şekilde hepsini yeniden adlandırmak istiyoruz. Ama hepsine bakamayız. Yani gerçekten çalışan bir kitaplığa veya programa ihtiyacımız var.
Bunlar çeşitli şekillerde ASCII, ISO-8859-1, UTF-8, Microsoft CP1252 veya Apple MacRoman'da bulunmaktadır. Bir şeyin ASCII olup olmadığını anlayabileceğimizi bilsek de ve bir şeyin muhtemelen UTF-8 olup olmadığını bilmek konusunda iyi bir değişikliğe katlansak da, 8 bitlik kodlamalar konusunda şaşkınız. Çoğu masaüstünün Mac olduğu karma bir Unix ortamında (Solaris, Linux, Darwin) çalıştığımız için, can sıkıcı birkaç MacRoman dosyamız var. Ve bunlar özellikle bir problem.
Bir süredir programlı olarak hangilerinin hangileri olduğunu belirlemenin bir yolunu arıyordum
- ASCII
- ISO-8859-1
- CP1252
- MacRoman
- UTF-8
bir dosya var ve üç farklı 8-bit kodlamayı güvenilir bir şekilde ayırt edebilecek bir program veya kitaplık bulamadım. Muhtemelen tek başına binden fazla MacRoman dosyamız vardır, bu yüzden hangi karakter seti algılayıcısını kullanırsak kullanalım bunları koklayabilmeli. Baktığım hiçbir şey hileyi yönetemez. Yoğun bakım karakter seti dedektör kitaplığı için büyük umutlarım vardı , ancak MacRoman'ı kaldıramaz. Hem Perl hem de Python'da aynı tür şeyleri yapmak için modüllere de baktım, ama tekrar tekrar aynı hikaye: MacRoman'ı tespit etmek için destek yok.
Bu nedenle aradığım şey, bir dosyanın bu beş kodlamadan hangisinin içinde olduğunu ve tercihen bundan daha fazla olduğunu güvenilir bir şekilde belirleyen mevcut bir kitaplık veya programdır. Özellikle, bahsettiğim üç 3-bit kodlamayı, özellikle de MacRoman'ı ayırt etmek zorundadır . Dosyaların% 99'undan fazlası İngilizce metindir; diğer dillerde birkaç tane var ama çok değil.
Kitaplık koduysa, dil tercihimiz Perl, C, Java veya Python'da ve bu sırayla olmasıdır. Bu sadece bir programsa, tam kaynakta geldiği, Unix üzerinde çalıştığı ve tamamen serbest olduğu sürece hangi dilde olduğu gerçekten umurumuzda değil.
Rastgele kodlanmış milyonlarca eski metin dosyası sorunu olan var mı? Eğer öyleyse, bunu nasıl çözmeye çalıştınız ve ne kadar başarılıydınız? Sorumun en önemli yönü bu, ancak programcıları dosyalarını bu dosyaların içinde bulundukları gerçek kodlamayla adlandırmaya (veya yeniden adlandırmaya) teşvik etmenin, gelecekte bu sorunu önlememize yardımcı olup olmayacağını da merak ediyorum. Hiç kimse bunu kurumsal bir temelde uygulamaya çalıştı mı ve öyleyse bu başarılı oldu mu , başarısız oldu ve neden?
Ve evet, sorunun doğası göz önüne alındığında neden kesin bir cevabı garanti edemeyeceğimi anlıyorum. Bu, özellikle devam etmek için yeterli veriye sahip olmadığınız küçük dosyalarda geçerlidir. Neyse ki, dosyalarımız nadiren küçüktür. Rastgele README
dosya dışında , çoğu 50k - 250k boyut aralığındadır ve çoğu daha büyüktür. Birkaç K'den büyük herhangi bir şeyin İngilizce olması garanti edilir.
Sorun alanı biyomedikal metin madenciliğidir, bu nedenle bazen PubMedCentral'ın tüm Açık Erişim deposu gibi kapsamlı ve çok büyük şirketlerle uğraşıyoruz. Oldukça büyük bir dosya, 5,7 gigabaytlık BioThesaurus 6.0'dır. Bu dosya özellikle can sıkıcı çünkü neredeyse tamamı UTF-8. Bununla birlikte, bazı kafatasları gitti ve içine 8 bitlik kodlamada olan birkaç satır yapıştırdı — Microsoft CP1252, inanıyorum. Bunun üzerine gitmen epey zaman alıyor. :(