String 在lisp中解码八位字节中的单个字符

String 在lisp中解码八位字节中的单个字符,string,unicode,lisp,common-lisp,String,Unicode,Lisp,Common Lisp,如何从common lisp中的八位字节向量中解码单个字符 我想要像这样的东西: (decode-character vector :start i :encoding :utf-8) 或者更具体地说: (decode-character #(195 164 195 173 99 195 176) :start 0) => #\LATIN_SMALL_LETTER_A_WITH_DIAERESIS 它将返回UTF-8编码字符,该字符从vector中的i位置开始 我不知道如何使用babe

如何从common lisp中的八位字节向量中解码单个字符

我想要像这样的东西:

(decode-character vector :start i :encoding :utf-8)
或者更具体地说:

(decode-character #(195 164 195 173 99 195 176) :start 0)
=> #\LATIN_SMALL_LETTER_A_WITH_DIAERESIS
它将返回UTF-8编码字符,该字符从
vector
中的
i
位置开始


我不知道如何使用babel或flexi streams实现这一点。

这可能不是您想要的(如果可以,我很乐意更新)。 我没有看Babel,但我想你可以将这种方法推广到其他编码。这里我将继续使用
triple-utf-8
。我会这样做:

(defun decode-utf-8-char (octet-vector &key (start 0))
  (char (trivial-utf-8:utf-8-bytes-to-string 
          octet-vector
          :start start
          :end (+ start 4)) 0))
使用示例向量给出所需的结果。
它之所以能工作,是因为utf-8字符最多只能使用。调用
char
是为了在实际读取多个字符的情况下获取第一个字符。

您可以看看@coredump triatile-utf-8没有我想要的,并且只支持utf-8编码。我以前不会
强制
,而是
检查类型
编码
关键字参数似乎与问题相关。如果它使用@coredump的答案中的start和end关键字参数,这将起作用。我希望能有一些东西不会不必要地创建字符串,但这至少是可行的。@Thayne如果你需要在较低的级别上工作,你也可以看看八进制到字符串是如何实现的。也许引入一个定制的
读取字符
函数来从流中获取下一个字符并不难实现。
(defun decode-character (vector &rest args)
  (char (apply #'babel:octets-to-string
               (coerce vector '(vector (unsigned-byte 8))) args)
        0))