Печать текста UTF-8 в Slime REPL

Я начинающий пользователь 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? Как я могу это исправить?


person nmashton    schedule 16.02.2012    source источник
comment
Странный. Каков результат (int \ṃ) при входе в SLIME REPL?   -  person Matthias Benkard    schedule 17.02.2012
comment
Поскольку это правильный ответ, должно быть что-то не так с способом чтения файла. ((toch 44) 91) также должен дать 7747. Если да, то этот вопрос для меня полная загадка. Если, с другой стороны, это не так, вам нужно проверить, какую кодировку принимает Java при чтении файла.   -  person Matthias Benkard    schedule 18.02.2012
comment
Извините, (int (.charAt (toch 44) 91)) это то, что я имел в виду.   -  person Matthias Benkard    schedule 18.02.2012
comment
Это дает неправильный ответ. Поэтому я заменил FileReader на InputStreamReader и FileInputStream, снабдил InputStreamReader правильной кодировкой, и теперь он работает. Таким образом, проблема должна заключаться в том, что FileReader принимает неправильную кодировку. Спасибо!   -  person nmashton    schedule 18.02.2012


Ответы (1)


Попробуйте поставить

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

в ваш .emacs файл (или установив и сохранив переменную через M-x customize-variable).

Вдобавок убедитесь, что вы запускаете Clojure из локали с поддержкой UTF-8 (если вы используете Un * x и используете Leiningen, попробуйте что-нибудь вроде env LC_ALL=en_US.UTF-8 lein swank).

person Matthias Benkard    schedule 16.02.2012
comment
К сожалению, ни один из этих способов не помогает. У меня уже была slime-net-coding-system, установленная на utf-8-unix. Изменение локали шикарного сервера ничего не изменило. - person nmashton; 16.02.2012