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

时间:2015-10-17 16:34:27

标签: string unicode lisp common-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-stream来做到这一点。

2 个答案:

答案 0 :(得分: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 :(得分:1)

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