Я нахожу при использовании «utf-16» в качестве кодировки для преобразования строки lisp в строку C с cffi, используемая фактическая кодировка - UTF-16LE. Но при преобразовании строки C в строку lisp используется фактическая кодировка 'utf-16be'. Поскольку я еще не знаком с 'babel' (который предоставляет средство кодирования для 'cffi'), я не уверен, что это ошибка.Кодирование «utf-16» несовместимо при преобразовании lisp-строки из строки/в строку C
(defun convtest (str to-c from-c)
(multiple-value-bind (ptr size)
(cffi:foreign-string-alloc str :encoding to-c)
(declare (ignore size))
(prog1
(cffi:foreign-string-to-lisp ptr :encoding from-c)
(cffi:foreign-string-free ptr))))
(convtest "hello" :utf-16 :utf-16) ;=> garbage string
(convtest "hello" :utf-16 :utf-16le) ;=> "hello"
(convtest "hello" :utf-16 :utf-16be) ;=> garbage string
(convtest "hello" :utf-16le :utf-16be) ;=> garbage string
(convtest "hello" :utf-16le :utf-16le) ;=> "hello"
Параметр `convtest 'преобразовать LISP строку в строку C затем обратно в LISP строки, с` к-с', `из-с» как кодирование. Все выходные строки мусора совпадают. Из теста мы видим, что если мы будем использовать 'utf-16' как `to-c 'и` from-c' в то же время, преобразование завершилось неудачно.
Спасибо. Я запускаю SBCL на Ubuntu Linux x86. – xiepan