如何使用SBCL Common Lisp从文件加载非标准字符?

时间:2017-02-03 20:06:06

标签: file-io character-encoding common-lisp sbcl

尝试 加载包含一行的文件内容:xdf[xdf[list('abcdefg')].eq('yes').any(1)]

λέξη

输出

(with-open-file (s PATH-TO-FILE :direction :input)
  (let ((a (read-line s)))
    (print a)))

尝试:

""
T

输出

(with-open-file (s PATH-TO-FILE :direction :input)
  (let ((buffer ""))
    (do ((character (read-char s nil) (read-char s nil)))
        ((null character))
      (setf buffer (concatenate 'string buffer (format nil "~a" character))))
    (format t "~a" buffer)))

我想要的是加载包含此类非标准字符的所有文件行。 然后我希望能够将这些单词输出到控制台或通过LTK小部件(例如按钮上的文本)。

1 个答案:

答案 0 :(得分:0)

您需要将:external-format X传递给with-open-file,其中 X是文件中使用的实际编码(:utf-8:ISO-8859-7或其他)。

(with-open-file (stream PATH-TO-FILE :external-format :utf-8)
  (let ((line (read-line stream)))
    (loop :for char :across line :do 
       (print (list (char-name char) (char-code char))))
    line))

因为它打印

("ZERO_WIDTH_NO-BREAK_SPACE" 65279) 
("GREEK_SMALL_LETTER_LAMDA" 955) 
("GREEK_SMALL_LETTER_EPSILON_WITH_TONOS" 941) 
("GREEK_SMALL_LETTER_XI" 958) 
("GREEK_SMALL_LETTER_ETA" 951) 

你可以看到你确实正确地阅读了文件。

现在问题是如何将打印这些非ASCII字符添加到屏幕上,这是一个完全不同的问题。