String 在lisp中解码八位字节中的单个字符
如何从common 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
(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))