2015-10-17 56 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

相關問題