gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:11:13 33 4
gpt4 key购买 nike

下午好。假设我有一个带单个字母的utf-8文件,说“f”(不带\n和空格),并且尝试获取一系列的行长。

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

我得到
=> (2)

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

最佳答案

Reading UTF-8 - BOM marker涵盖了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")))

例如,如果您想使用 line-seq懒惰地读取文件,例如因为它很大,则必须使用 debomify处理第一行。其余的可以正常读取。因此:
(defn debommed-line-seq
[^java.io.BufferedReader rdr]
(when-let [line (.readLine rdr)]
(cons (debomify line) (lazy-seq (line-seq rdr)))))

关于clojure - 具有BOM表的UTF-8文件中第一行的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13789092/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com