2015-06-15 5 views
0

Я нахожу при использовании «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' в то же время, преобразование завершилось неудачно.

ответ

1

Здесь кодировка to-c предполагает минимальное значение endian (le) по умолчанию. From-c имеет значение big-endian по умолчанию (be).

Сама платформа (x86) немного ориентирована. UTF-16 предпочитает большой endian или берет информацию из байт-ордера.

Возможно, это зависит от платформы, на которой вы работаете? Кажется, что у платформ разные значения по умолчанию.

Лучше всего изучить исходный код, почему выбраны эти кодировки. Также вы можете запросить список рассылки CFFI о выборе кодировки и о том, как они зависят от платформы, если вообще.

+0

Спасибо. Я запускаю SBCL на Ubuntu Linux x86. – xiepan

 Смежные вопросы

  • Нет связанных вопросов^_^