在Slime REPL中打印UTF-8文本

5

我是Emacs和Clojure的初学者,正在使用一些简单的文本处理测试我的工作环境。我遇到了一个问题,就是Slime REPL不能正确地打印存储在向量中的UTF-8文本。

我首先将文件内容(Tocharian 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之间有什么误解吗?我该如何解决这个问题?


奇怪。在SLIME REPL中输入(int \ṃ)的结果是什么? - Matthias Benkard
既然那是正确的答案,那么读取文件的方式肯定有问题。((toch 44) 91)也应该得到7747。如果确实如此,那么这个问题对我来说就是一个完全的谜。另一方面,如果不是这样,那么您需要检查Java在读取文件时所假定的编码方式。 - Matthias Benkard
1
抱歉,我想表达的是 (int (.charAt (toch 44) 91)) - Matthias Benkard
1
它提供了错误的答案。因此,我用InputStreamReader和FileInputStream替换了FileReader,并为InputStreamReader提供了正确的编码,现在它可以正常工作了。因此,问题一定是FileReader假设了错误的编码。谢谢! - nmashton
1个回答

3

尝试输入

(setq slime-net-coding-system 'utf-8-unix)

将以下代码添加到你的.emacs文件中(或通过M-x customize-variable设置并保存该变量)。
此外,请确保您正在使用支持UTF-8编码的区域设置运行Clojure(如果您在类Unix系统上使用Leiningen,尝试像这样运行:env LC_ALL=en_US.UTF-8 lein swank)。

很遗憾,这些方法都没有解决问题。我已经将slime-net-coding-system设置为utf-8-unix了。改变swank服务器的区域设置也没有产生任何效果。 - nmashton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接