Common Lisp中的字符集

时间:2017-02-02 13:55:47

标签: xml windows xml-parsing common-lisp clisp

我一直致力于一个通用的lisp程序,该程序解析两个XML文件,并以自定义方式将它们组合成第三个XML。不幸的是,lisp使用CP1252字符集,而我的XML文件使用UTF-8并包含一些不能在CP1252中使用的日文字符。

我一直试图通过添加

使clisp使用UTF-8
:external-format 'charset:UTF-8

同时加载(如建议的here)和read-line(因为为什么不是)函数,但clisp仍会抛出此错误:

  

READ-LINE:CHARSET中的字节#x81无效:CP1252转换

有没有办法用我的代码做我想要的?我对lisp来说还是一个新手。

完整读取功能代码:

(defun readXML (stream libSize)
    (defparameter lib nil)
    (defparameter x 1)
    (loop
        (defparameter lib (cons (read-line stream :external-format 'charset:UTF-8) lib))
        (defparameter x (+ x 1))
        (when (> x libSize) (return lib))))

1 个答案:

答案 0 :(得分:5)

的错误

read-line

此函数接受:external-format参数。

它确实接受了几个可选参数,但它们无关 用编码。

defparameter

这是一个"顶级"运算符,它创建一个全局dynamic variable从不在函数内使用它。 而是使用let - binds variables lexicallyloop(见下文)也会绑定变量。

更正代码

(defun read-lines (file-name max-lines)
  "Open the file and read it line-by-line, at most `max-lines'."
  (with-open-file (stream file-name :external-format charset:utf-8)
    (loop :for line = (read-line stream nil nil)
      :for line-number :upfrom 0
      :while (and line (< line-number max-lines))
      :collect line)))

或者,稍微简单一些(由@jkiiski建议):

(defun read-lines (file-name max-lines)
  "Open the file and read it line-by-line, at most `max-lines'."
  (with-open-file (stream file-name :external-format charset:utf-8)
    (loop :for line = (read-line stream nil nil)
      :repeat max-lines
      :while line
      :collect line)))

说明

  • with-open-file打开 文件,将stream绑定到结果并确保流是 退出时关闭。

  • loop非常先进 迭代设施。它将line绑定到每个连续的行,计数 他们使用line-number,并将行收集到返回值中:

PS。请按照答案中的所有链接。 他们详细解释了每个操作员。