如何从常见的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来做到这一点。
答案 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))