Xml 公共Lisp中的字符集

Xml 公共Lisp中的字符集,xml,windows,xml-parsing,common-lisp,clisp,Xml,Windows,Xml Parsing,Common Lisp,Clisp,我一直在开发一个通用的lisp程序,该程序解析两个XML文件,并以自定义方式将它们组合成第三个XML。不幸的是,lisp使用CP1252字符集,而我的XML文件使用UTF-8,并且包含一些不能在CP1252中使用的日语字符 我一直试图通过添加 :external-format 'charset:UTF-8 加载(如建议的)和读取行(因为为什么不)功能,但clisp仍然抛出此错误: 读取行:字符集CP1252转换中的无效字节#x81 有没有办法用我的代码做我想做的事情?我对lisp还是相当陌生的

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

我一直试图通过添加

:external-format 'charset:UTF-8
加载(如建议的)和读取行(因为为什么不)功能,但clisp仍然抛出此错误:

读取行:字符集CP1252转换中的无效字节#x81

有没有办法用我的代码做我想做的事情?我对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))))
错误 此函数不接受参数

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

这是一个“顶级”操作符,它创建一个全局。 不要在函数中使用它。 用那里代替它。
循环
(见下文)也会绑定变量

正确代码 解释
  • 打开 文件,将
    绑定到结果,并确保流 出口关闭

  • 这是一种非常先进的方法 迭代工具。它将
    绑定到每个连续行,计数 使用
    行号
    对其进行编辑,并将行收集到返回值中:

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

错误 此函数不接受参数

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

这是一个“顶级”操作符,它创建一个全局。 不要在函数中使用它。 用那里代替它。
循环
(见下文)也会绑定变量

正确代码 解释
  • 打开 文件,将
    绑定到结果,并确保流 出口关闭

  • 这是一种非常先进的方法 迭代工具。它将
    绑定到每个连续行,计数 使用
    行号
    对其进行编辑,并将行收集到返回值中:

请按照答案中的所有链接。
它们详细解释了每个运算符。

读取行
不接受
:外部格式
。另外,我认为您混淆了
load
open
。最后,请包括您的完整代码。添加外部格式读取行只是一个随机的事情我尝试。关于加载-我一直在从windows命令提示符启动clisp并使用(加载“filename.lisp”:外部格式“charset:UTF-8)。您的
“filename.txt”
是否包含lisp表单?如果是,为什么要给它
“txt”
文件类型而不是更常见的
“lisp”
“l”
“cl”
?如果不是,为什么要用它?我在上面输入注释时出错了-它是.lisp而不是.txt。“lisp使用CP1253字符集”?Lisp不是一种语言,它是一个语言家族,其中任何一种语言都可能有多个实现,每个实现可能以不同的方式支持不同的字符集。
读取行
不接受
:外部格式
。另外,我认为您混淆了
load
open
。最后,请包括您的完整代码。添加外部格式读取行只是一个随机的事情我尝试。关于加载-我一直在从windows命令提示符启动clisp并使用(加载“filename.lisp”:外部格式“charset:UTF-8)。您的
“filename.txt”
是否包含lisp表单?如果是,为什么要给它
“txt”
文件类型而不是更常见的
“lisp”
“l”
“cl”
?如果不是,为什么要用它?我在上面输入注释时出错了-它是.lisp而不是.txt。“lisp使用CP1253字符集”?Lisp不是一种语言,它是一个语言家族,任何一种语言都可能有多种实现,每一个都可能以不同的方式支持不同的字符集。
:REPEAT MAX-LINES
会更简单一些,因为
行号
不用于其他任何东西。
:REPEAT MAX-LINES
会更简单一些,因为
行号
不用于其他任何东西。
(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)))
(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)))