如何处理Common Lisp(SBCL)中的重音?

时间:2017-01-04 20:52:21

标签: character-encoding lisp common-lisp sbcl

这可能是非常基本的,但我不知道还能在哪里问。我正在尝试从用葡萄牙语编写的文件处理SLIME REPL中的一些文本信息,因此使用了许多重音字符 - 例如é,á,ô等。

当我用英语处理文本时,我使用以下功能:

(defun txt2list (name)
  (with-open-file (in name)
      (let ((res))
        (do ((line (read-line in nil nil)
                   (read-line in nil nil)))
        ((null line)
         (reverse res))
      (push line res))
    res)))

无法读取重音字符,给出错误“八位字节序列#(195)无法解码。”。

所以我的问题是:有没有办法自动操纵这些字符?没有重音('á'变成'a')或者只是删除这些字符('cômodo'变成'cmodo')可以替换那些字母的字符,无论是在阅读之前在文件本身中完成还是在阅读过程。

1 个答案:

答案 0 :(得分:5)

您需要找出文件使用的文本编码。然后告诉WITH-OPEN-FILE使用正确的。

请参阅SBCL手册:External Formats

示例:

 (with-open-file (stream pathname :external-format '(:utf-8 :replacement #\?))
   (read-line stream))