2015-10-17 57 views
3

如何解码常见lisp中八位字节的单个字符?从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 

这将在i位置vector返回UTF-8编码的字符开始。

我无法弄清楚如何使用babel或flexi-streams来做到这一点。

+0

你可以看看[琐碎的UTF-8](https://common-lisp.net/project/trivial-utf-8/) – coredump

+0

@coredump琐碎的UTF-8不有我正在寻找,只支持utf-8编码。 – Thayne

回答

1

这可能不是你正在寻找的东西(如果可以,我会很乐意更新)。 我没有看巴别塔,但你可以概括为我猜想的其他编码的方法。我会坚持在这里trivial-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字符最多为4 bytes long。拨打char是为了抓住第一个字符,以防万一实际阅读。

1
(defun decode-character (vector &rest args) 
    (char (apply #'babel:octets-to-string 
       (coerce vector '(vector (unsigned-byte 8))) args) 
     0)) 
+0

我不会'强迫',而是'检查类型'。 – Svante

+0

编码关键字参数似乎与问题相关。 – Svante

+0

如果它在@ coredump的答案中使用了开始和结束关键字参数,它将会起作用。我希望有些东西不会不必要地创建一个字符串,但至少可以起作用。 – Thayne

相关问题