【发布时间】:2012-03-08 01:28:07
【问题描述】:
我是 Emacs 和 Clojure 的初学者,我通过一些简单的文本处理来测试我的工作环境。我在让 Slime REPL 正确打印存储在向量中的 UTF-8 文本时遇到问题。
我首先将文件(吐火罗 B 的字典)的内容读入向量:
user> (def toch
(with-open [rdr (java.io.BufferedReader.
(java.io.FileReader. "/directory/toch.txt"))]
(vec (line-seq rdr))))
=> #'user/toch
然后我尝试从向量中获取一条线,但我得到了垃圾:
user> (toch 44)
=> " Examples : /// kektseñe akappi ste ‘the body is an impurity’ (121b5), akappī = BHS aśuciṃ (529a3). "
我可以将字符串输入到 Slime REPL 中并按原样取回:
user> " Examples : /// kektseñe akappi ste ‘the body is an impurity’ (121b5), akappī = BHS aśuciṃ (529a3). "
=> " Examples : /// kektseñe akappi ste ‘the body is an impurity’ (121b5), akappī = BHS aśuciṃ (529a3). "
我可以毫无问题地打印到磁盘:
user> (binding [*out* (java.io.FileWriter. "test.txt")]
(prn (toch 44)))
=> nil
[Contents of test.txt: " Examples : /// kektseñe akappi ste ‘the body is an impurity’ (121b5), akappī = BHS aśuciṃ (529a3). "]
并且从其他 REPL(例如 clj、lein repl)的向量中获取行也可以正常工作。只有当我尝试查看 Slime REPL 中的向量内容时才会出现问题。
这里发生了什么? Emacs 和 Swank 之间是否存在一些误解?我该如何解决这个问题?
【问题讨论】:
-
很奇怪。
(int \ṃ)输入到 SLIME REPL 的结果是什么? -
既然是正确答案,那么文件的读取方式肯定有问题。
((toch 44) 91)也应该产生7747。如果是这样,那么这个问题对我来说是一个完全的谜。另一方面,如果不是,那么您需要检查 Java 在读取文件时采用的编码。 -
对不起,
(int (.charAt (toch 44) 91))是我的意思。 -
它给出了错误的答案。所以我用 InputStreamReader 和 FileInputStream 替换了 FileReader,并为 InputStreamReader 提供了正确的编码,现在它可以工作了。所以问题一定是 FileReader 假设了错误的编码。谢谢!
标签: emacs utf-8 clojure slime swank-clojure