-1

cffi を使用して Lisp 文字列を C 文字列に変換するエンコーディングとして「utf-16」を使用すると、実際に使用されるエンコーディングは「utf-16le」であることがわかりました。しかし、C 文字列を Lisp 文字列に戻す場合、実際に使用されるエンコーディングは 'utf-16be' です。私はまだ「babel」(「cffi」のエンコーディング機能を提供する) に慣れていないので、それがバグかどうかはわかりません。

(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」として同時に使用すると、変換が失敗することがわかります。

4

1 に答える 1

2

ここで、エンコーディング to-c は、デフォルトでリトル エンディアン (le) を想定しています。From-c は、デフォルトとしてビッグエンディアンを持ちます (be)。

プラットフォーム自体 (x86) はリトルエンディアンです。UTF-16 はビッグ エンディアンを優先するか、バイト オーダー マークから情報を取得します。

これはおそらく、実行しているプラ​​ットフォームに依存しますか? プラットフォームによってデフォルトが異なるようです。

なぜこれらのエンコーディングが選択されているのか、ソースコードを調べるのが最善です。また、エンコーディングの選択と、それらがプラットフォームにどのように依存するかについて、CFFI メーリング リストで質問することもできます。

于 2015-06-15T19:07:02.063 に答える