2012-12-09 14 views
5

Tünaydın. Tek bir harfle bir utf-8 dosyası olduğunu varsayalım, "f" (no \ n ve boşluklar) deyin ve ben bir dizi satır uzunluğu elde etmeye çalışıyorum.BOM ile bir UTF-8 dosyasındaki ilk satırın uzunluğu

(with-open [rdr (reader "test.txt")] 
    (doall (map #(.length %) (line-seq rdr)))) 

Ve

=> (2) 

Neden

olsun? İlk dizenin doğru uzunluğunu elde etmenin herhangi bir yolu var mı?

+0

Kodunuzu, bir ya da iki baytlık karakterler içeren UTF-8 dosyasıyla, her ikisi de sonunda \ nn ile ya da olmadan kullandım. Her durumda '(1)' aldım. Clojure sürümün nedir? – Jan

+2

Sadece rastgele bir düşünce, test dosyalarınıza bir BOM koyarsanız ne olur? – SirDarius

+0

Benim Clojure sürüm 1.4'tür. Evet, gerçekte bu BOM. Sorunu nasıl atlayabilirim? –

cevap

7

Java'da BOM sorunu Reading UTF-8 - BOM marker kapsamındadır. O yani

(defn debomify 
    [^String line] 
    (let [bom "\uFEFF"] 
    (if (.startsWith line bom) 
     (.substring line 1) 
     line))) 

(doall (map #(.length %) (.split (debomify (slurp "test.txt")) "\n"))) 

Eğer çok büyük olduğu için örneğin tembel line-seq kullanarak bir dosya, okumak istiyorsanız

, sen tedavi etmek zorunda, Apache Commons BOMInputStream kullanılarak abstracted veya elle çıkarılması gerekmektedir edilebilir görünüyor debomify kullanarak ilk satırı. Kalanlar normal olarak okunabilir. Bu nedenle, yeniden üretemiyorum.

(defn debommed-line-seq 
    [^java.io.BufferedReader rdr] 
    (when-let [line (.readLine rdr)] 
    (cons (debomify line) (lazy-seq (line-seq rdr))))) 
+0

Teşekkürler. Belki de bu bir çözümdür. –

+0

Daha ayrıntılı sürüm için teşekkürler. –

+0

Belki de en uygun yöntem basitçe (debomify (slurp "test.txt")) yapmak ve daha sonra bölmek. –

İlgili konular