Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 带BOM的UTF-8文件中第一行的长度_Clojure - Fatal编程技术网

Clojure 带BOM的UTF-8文件中第一行的长度

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

下午好。假设我有一个只有一个字母的utf-8文件,比如说“f”(无\n和空格),然后我尝试获得一个行长度序列

(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,…懒散的方法是受欢迎的。谢谢你指出这一点。