Clojure 带BOM的UTF-8文件中第一行的长度
下午好。假设我有一个只有一个字母的utf-8文件,比如说“f”(无\n和空格),然后我尝试获得一个行长度序列Clojure 带BOM的UTF-8文件中第一行的长度,clojure,Clojure,下午好。假设我有一个只有一个字母的utf-8文件,比如说“f”(无\n和空格),然后我尝试获得一个行长度序列 (with-open [rdr (reader "test.txt")] (doall (map #(.length %) (line-seq rdr)))) 我得到 => (2) 为什么??有什么优雅的方法可以获得第一个字符串的正确长度吗?中讨论了Java中的BOM问题。它似乎可以从Apache的Commons中抽象出来,或者必须手动删除,即 (defn debomif
(with-open [rdr (reader "test.txt")]
(doall (map #(.length %) (line-seq rdr))))
我得到
=> (2)
为什么??有什么优雅的方法可以获得第一个字符串的正确长度吗?中讨论了Java中的BOM问题。它似乎可以从Apache的Commons中抽象出来,或者必须手动删除,即
(defn debomify
[^String line]
(let [bom "\uFEFF"]
(if (.startsWith line bom)
(.substring line 1)
line)))
(doall (map #(.length %) (.split (debomify (slurp "test.txt")) "\n")))
如果您想使用line seq
惰性地读取文件,例如,因为文件太大,您必须使用debomify
处理第一行。其余的可以正常读取。因此:
(defn debommed-line-seq
[^java.io.BufferedReader rdr]
(when-let [line (.readLine rdr)]
(cons (debomify line) (lazy-seq (line-seq rdr)))))
我无法复制它。我在UTF-8文件中使用了您的代码,该文件包含一个或两个字节的字符,无论结尾是否有
\n
。在所有情况下,我都得到了(1)
。你的Clojure版本是什么?只是一个随机的想法,如果你在测试文件中放一个BOM会怎么样?我的Clojure版本是1.4。是的,事实上这就是BOM。我怎样才能绕过这个问题呢?谢谢。也许这是一个解决方案。感谢您提供更详细的版本。也许更优化的方法是简单地进行(debomify(slurp“test.txt”))然后将其拆分。@öцццццццццц,谢谢,您完全正确。我已经确定了答案。@michielworkent,…懒散的方法是受欢迎的。谢谢你指出这一点。