2017-02-03 2 views
2

Попытка содержимое нагружения файла, содержащего одну строку со словом: λέξηКак загрузить нестандартные символы из файла с помощью SBCL Common Lisp?

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

выходы

"" 
T 

Trying:

(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))) 

выходов

funny characters (nothing like the original contents) 
T 

Что я хотел бы сделать, это загрузить все строки файла, содержащие такие нестандартные символы. Затем я хочу иметь возможность выводить эти слова на консоль или через виджеты LTK (например, текст на кнопке).

+0

Что происходит, когда вы оцениваете '(setf sb-impl :: * default-external-format *: utf-8)' и повторите попытку? – tsikov

+0

Я изменил кодировку на UTF8 во входном файле, а затем добавил вашу предложенную строку ко второй версии кода и оценил. Вывод: '?????' newline 'T'. Первая версия с добавлением этой дополнительной строки все еще выводит '' '' '' '' '' '' '' ' –

+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 на экране, и это совершенно другой вопрос.

+0

Он по-прежнему выводит '?????', если я использую: utf-8, и файл был «сохранен как» с использованием кодировки UTF-8. –

+0

это не значит, что он читал неправильно - возможно, он печатает неправильно. – sds

+0

Хм. Не могли бы вы рассказать мне, как мне это сделать? И вообще, как с этим справиться? –

Смежные вопросы