具有BOM的UTF-8文件中第一行的长度

Ole*_*nov 5 clojure

下午好.假设我有一个带有单个字母的utf-8文件,比如"f"(没有\n和空格),我试着获得一系列行长度.

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

我明白了

=> (2)
Run Code Online (Sandbox Code Playgroud)

为什么?是否有任何优雅的方法来获得第一个字符串的正确长度?

Jan*_*Jan 7

阅读UTF-8 - BOM标记涵盖了Java中的BOM问题.似乎可以使用Apache的Commons中的BOMInputStream将其抽象出来,或者必须手动删除它,即

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

(doall (map #(.length %) (.split (debomify (slurp "test.txt")) "\n")))
Run Code Online (Sandbox Code Playgroud)

如果你想懒惰地阅读文件line-seq,例如因为它很大,你必须使用处理第一行debomify.其余的可以正常阅读.因此:

(defn debommed-line-seq
  [^java.io.BufferedReader rdr]
  (when-let [line (.readLine rdr)]
    (cons (debomify line) (lazy-seq (line-seq rdr)))))
Run Code Online (Sandbox Code Playgroud)