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

File io 如何使用SBCL Common Lisp从文件中加载非标准字符?,file-io,character-encoding,common-lisp,sbcl,File Io,Character Encoding,Common Lisp,Sbcl,尝试 加载包含一行字的文件内容:λέξη (with-open-file (s PATH-TO-FILE :direction :input) (let ((a (read-line s))) (print a))) 输出 "" T funny characters (nothing like the original contents) T 尝试: (with-open-file (s PATH-TO-FILE :direction :input) (let ((buff

尝试 加载包含一行字的文件内容:
λέξη

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

""
T
funny characters (nothing like the original contents)
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)))
输出

""
T
funny characters (nothing like the original contents)
T
我想做的是加载包含这些非标准字符的所有文件行。 然后我希望能够将这些单词输出到控制台或通过LTK小部件(例如按钮上的文本)。

您需要传递到,其中
X
是文件中使用的实际编码(
:utf-8
或其他)

因为它会打印

("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字符打印到屏幕上,这是一个完全不同的问题。

当您计算
(setf sb impl::*默认外部格式*:utf-8)
并重试时会发生什么情况?我将输入文件中的编码更改为UTF8,然后将建议的行添加到第二个版本的代码中并进行了计算。输出为:
??
换行
T
。添加此附加行的第一个版本仍然输出
新行
T
谢谢您的帮助!如果我使用:utf-8,它仍然输出
,并且文件是使用utf-8编码“另存为”的。这并不意味着它读错了-它可能是打印错了。嗯。你能告诉我怎样输出它吗?通常如何处理?试试我的代码。它打印什么?“在计算从第25行开始的表单时,在线程(…)中的UNBOUND-VARIABLE上调用第0列(…)调试器时,变量C未绑定。”还警告未定义的变量:跨C打印未定义的函数:FOR